WebScraper C# + htmlagilitypack

WebScraper C# + htmlagilitypack

提问人:Кирилл Филободченко 提问时间:5/18/2020 最后编辑:DisappointedByUnaccountableModКирилл Филободченко 更新时间:2/6/2021 访问量:185

问:

我开始开发应用程序。在数据库中下载后,我需要从网站上获取一些信息,然后我需要处理这些信息。 好吧,我没有足够的经验,非常感谢您的任何建议。 例如 - 我将与体育网站合作。(https://terrikon.com/football/spain/championship/) 我需要从表中接收信息并将此数据下载到数据库中。 我尝试了一些下载数据的方法并了解了最好的方法 - 使用“htmlagilitypack”。 我阅读了有关使用此库的文档,并且做得最好:

using System;
using System.Xml;
using HtmlAgilityPack;

namespace Parser
{
    class Program
    {
        static void Main(string[] args)
        {
            var html = @"https://terrikon.com/football/spain/championship/";

            HtmlWeb web = new HtmlWeb();

            var htmlDoc = web.Load(html);

            var node = htmlDoc.DocumentNode.SelectSingleNode("//head/title");

            var table = htmlDoc.QuerySelector("#champs-table > table");

            var tableRows = table.QuerySelectorAll("tr");

            foreach (var row in tableRows)
            {
                var team = row.QuerySelector(".team"); 
                var win = row.QuerySelector(".win");
                var draw = row.QuerySelector(".draw");
                var lose = row.QuerySelector(".lose");
                Console.WriteLine(team.OuterHtml );
            };

        }
    }
}

如果我更改此字符串,我可以收到网站标题或所有信息

 var node = htmlDoc.DocumentNode.SelectSingleNode("//head");

你能给我建议我如何只从表格中获取信息吗? 感谢您的参观关注enter image description here

c# asp.net 解析 html解析 html-敏捷包

评论


答:

1赞 Jakub Kozera 5/18/2020 #1

我还建议安装一个 Css 选择器扩展,可以在这里找到:HtmlAgilityPack

https://github.com/hcesar/HtmlAgilityPack.CssSelector

有了它,您可以使用 css 选择器查询您的节点。 要从该表中获取信息,您必须知道它的 CSS 选择器。 在本例中,它:

#champs-table > table

因此,要获得整个表格,您可以这样做:

var table = htmlDoc.QuerySelector("#champs-table > table");
// then query rows of that table:

var tableRows = table.QuerySelectorAll("tr");

// Now each element it tableRows is a <tr> from that html table
// you could access every value in a for each loop
foreach(var row in tableRows)
{
  var team = row.QuerySelector(".team"); // "team" is a css class applied to <td> containing the team name
  var win = row.QuerySelector(".win");
  var draw = row.QuerySelector(".draw");
var lose = row.QuerySelector(".lose");

}

评论

0赞 Кирилл Филободченко 5/18/2020
感谢您的帮助。我读了CSS选择器,很好的链接!我明白你做了什么,但是当我尝试实现这段代码时,我在“ var table = doc 行中出现错误。QuerySelector(“#champs-table > table”);“ doc - 在当前上下文中不存在。这是什么意思?
0赞 Jakub Kozera 5/18/2020
你的调用,只需调整变量名称即可。我更新了我的代码段dochtmlDoc
0赞 Кирилл Филободченко 5/18/2020
嗯,我试过了。如果我进行此交换,我会遇到下一个问题:“'HTMLDocument'不包含'QuerySelector'的定义,并且找不到可访问的扩展方法'QuerySelector'接受'HTMLDocument'类型的第一个参数” 正确理解我可以使用 2 种技术在这个库中工作:1)CSS 选择器 2)XPATH,对于这两种技术,我不需要安装特殊包 (NUGET)?
0赞 Jakub Kozera 5/18/2020
QuerySelector是我链接的包中的扩展方法,您必须将其安装在项目中并导入命名空间才能使其正常工作
0赞 Кирилл Филободченко 5/18/2020
对不起,还有一个问题。我的下载数据没有问题,但是当我从表中打印数据时,我有什么问题?我附上带有结果和命令打印的屏幕照片。我做错了什么?