从网页中提取数据,解析特定部分并显示它

Alo*_*art 18 c# asp.net parsing server-side web-crawler

我已经使用这个网站很长时间来找到我的问题的答案,但我无法找到这个问题的答案.

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

我们的网站运行时间提前很长,因此我们正在尝试向网站添加更多内容.我想做的一件事就是把输入的游戏链接到Metacritic.

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

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

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

其中一个不容易做到的事情就是我正在学习c ++以及c#和asp,所以我不断让我的电线交叉.如果有人能指出我正确的方向,那将是一个很大的帮助.谢谢

Han*_*año 46

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

protected void Page_Load(object sender, EventArgs e)
{
    string url = "http://www.metacritic.com/game/pc/halo-spartan-assault";
    var web = new HtmlAgilityPack.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;
}
Run Code Online (Sandbox Code Playgroud)

获取XPath给定元素的简单方法是使用您的Web浏览器(我使用Chrome)开发人员工具:

  • 打开开发人员工具(F12Ctrl+ Shift+ C(Windows)或Command+ Shift+ C适用于Mac).
  • 在页面中选择您希望XPath的元素.
  • 右键单击"元素"选项卡中的元素.
  • 单击"Copy as XPath".

您可以像在c#中那样将其粘贴(如我的代码所示),但请确保转义引号.

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

  • Upvote从Chrome获取XPath值. (8认同)
  • 警告 - Chrome"修复"HTML.所以说你查询一个表中的元素,如果源html没有正确的<tbody>部分Chrome会添加它来呈现页面并在xpath中返回它.对于您的代码,您不希望tbody成为路径的一部分.要检查查看页面的来源并检测您的xpath. (4认同)
  • 我花了一段时间才意识到我的浏览器提取xpaths的方式与html敏捷包使用的方式不同,但是一旦我发现了这个问题,我只需花费几个小时就能完成我想要做的设置.谢谢您的帮助. (3认同)

Jas*_*aat 10

我推荐Dcsoup.它有一个nuget包,它使用css选择器,所以如果你使用jquery就很熟悉了.我尝试过其他人,但这是我发现的最好和最容易使用的.没有太多的文档,但它是开源和java jsoup库的一个端口,具有良好的文档.我非常喜欢它.

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

// <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);
Run Code Online (Sandbox Code Playgroud)


Jer*_*Net 9

我看了,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();
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过利用Metacritic使用元标记来解析所需数据的字符串.以下是元标记中提供的信息:

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

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