2013-08-05 52 views
13

我一直在使用这个网站很长一段时间来找到我的问题的答案,但我无法找到答案在这一个。从网页中提取数据,解析它的特定部分,并显示它

我正在与一个班级项目上的小组合作。我们要建立一个小型的“游戏交易”网站,允许人们注册,投入他们想要交易的游戏,并接受其他人的交易或请求交易。

我们的网站运行时间提前很多,所以我们试图增加更多的网站。我想要做的一件事就是把放入Metacritic的游戏链接起来。

这是我需要做的。我需要(在Visual Studio 2012中使用asp和c#)在metacritic上获取正确的游戏页面,抽取其数据,解析特定部分,然后在页面上显示数据。

基本上,当你选择一个你想交易的游戏时,我们需要一个小的div来显示游戏的信息和评分。我想通过这种方式来学习更多东西,并从这个项目中获得一些东西,我不必从头开始。

我想知道是否有人能告诉我从哪里开始。我不知道如何从网页中提取数据。我仍然试图弄清楚是否需要尝试写一些东西来自动搜索游戏的标题并以这种方式找到页面,或者如果我能找到某种方式直接进入游戏页面。一旦我获得了数据,我不知道如何从中获得所需的具体信息。

其中一件事情并没有使这个简单的事情是,我正在学习C++以及c#和asp,所以我不断让我的电线穿过。如果有人能指引我正确的方向,这将是一个很大的帮助。谢谢

+1

谷歌,HTML敏捷性包和提琴手 – ryan

+1

你要找的期限为屏幕抓取或[网页抓取(http://en.wikipedia.org/wiki/Web_scraping)。 – Greg

回答

29

这个小例子使用HtmlAgilityPack,并使用XPath选择器来获得所需的元素。

protected void Page_Load(object sender, EventArgs e) 
{ 
    string Url = "http://www.metacritic.com/game/pc/halo-spartan-assault"; 
    HtmlWeb web = new HtmlWeb(); 
    HtmlDocument doc = web.Load(Url); 

    string metascore = doc.DocumentNode.SelectNodes("//*[@id=\"main\"]/div[3]/div/div[2]/div[1]/div[1]/div/div/div[2]/a/span[1]")[0].InnerText; 
    string userscore = doc.DocumentNode.SelectNodes("//*[@id=\"main\"]/div[3]/div/div[2]/div[1]/div[2]/div[1]/div/div[2]/a/span[1]")[0].InnerText; 
    string summary = doc.DocumentNode.SelectNodes("//*[@id=\"main\"]/div[3]/div/div[2]/div[2]/div[1]/ul/li/span[2]/span/span[1]")[0].InnerText; 
} 

一个简单的方法来获得XPath给定元素是通过使用Web浏览器(我使用Chrome)开发工具:

  • 打开开发者工具(F12Ctrl键 + Shift + C on Windows or Command + Shift对于Mac,+ C)。
  • 在页面中选择要用于XPath的元素。
  • 右键单击“元素”选项卡中的元素。
  • 点击“Copy as XPath”。

你可以粘贴它就像在C#中(如我的代码所示),但一定要避免引号。

您必须确保使用一些错误处理技术,因为如果Web Scrapping更改页面的HTML格式时可能导致错误。

+2

我花了一段时间才意识到我的浏览器将xpath与xml敏捷包的使用方式不同,但是一旦我找到了这个问题,只花了几个小时才能完成我想要做的功能设置。感谢您的帮助。 – Aloehart

+5

Upvote从Chrome获取XPath值。 –

+0

@Aloehart html敏捷包希望xpaths如何?我认为我有同样的问题 – Djeroen

5

我看了,Metacritic.com没有API。

您可以使用HttpWebRequest获取网站的内容作为字符串。

using System.Net; 
using System.IO; 
using System.Windows.Forms; 

string result = null; 
string url = "http://www.stackoverflow.com"; 
WebResponse response = null; 
StreamReader reader = null; 

try 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "GET"; 
    response = request.GetResponse(); 
    reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
    result = reader.ReadToEnd(); 
} 
catch (Exception ex) 
{ 
    // handle error 
    MessageBox.Show(ex.Message); 
} 
finally 
{ 
    if (reader != null) 
     reader.Close(); 
    if (response != null) 
     response.Close(); 
} 

然后,您可以利用Metacritic使用元标记来分析所需数据的字符串。下面是可用的,他们在meta标签中的信息:

  • OG:标题
  • OG:类型
  • OG:URL
  • OG:图像
  • OG:SITE_NAME
  • OG:描述

每个标签的格式是:meta name="og:title" content="In a World..."

6

我建议Dcsoup。它有一个nuget package它,它使用CSS选择器,所以它是熟悉的,如果你使用jQuery。我尝试过其他人,但这是我找到的最好也是最容易使用的。没有太多的文档,但它是开源的,并且具有good documentation的java jsoup library的端口。我绝对喜欢它。

var doc = Dcsoup.Parse(new Uri("http://www.metacritic.com/game/pc/fallout-4"), 5000); 

// <span itemprop="ratingValue">86</span> 
var ratingSpan = doc.Select("span[itemprop=ratingValue]"); 
int ratingValue = int.Parse(ratingSpan.Text); 

// selectors match both critic and user scores 
var scoreDiv = doc.Select("div.score_summary"); 
var scoreAnchor = scoreDiv.Select("a.metascore_anchor"); 
int criticRating = int.Parse(scoreAnchor[0].Text); 
float userRating = float.Parse(scoreAnchor[1].Text); 
+0

太棒了!非常感谢。我想知道为什么它没有在线文档...这将是非常光滑的! –

+0

它工作得很好,btw !!! –

+0

这正是我所需要的。奇怪的是,这为我创造了与文化相关的问题**:当我尝试使用float.Parse()这个具有分数(例如7.5)的HTML文本元素时,我得到了一个解析错误,因为我的文化设置是不同的(例如,7.5是7.5)。因此,无论何时我使用分数进行分析,我都必须将'CultureInfo.InvariantCulture'作为来自命名空间System.Globalization的一个可选参数加入,之后才能正常工作。 – rTECH

相关问题