article --6ren">
gpt4 book ai didi

c# - HtmlAgilityPack 的可见区域有多深?

转载 作者:行者123 更新时间:2023-12-04 10:48:46 29 4
gpt4 key购买 nike

我需要从博客中获取一些帖子。一切都很顺利,直到我想获得帖子创建日期。它的 DOM 树是:

div class="stories-feed__container" 
-> article
-> div class="story__main"
-> div class="story__footer"
-> div class="story__user user"
-> div class="user__info-item"
-> time datetime="date and time in UTC format".

所以我写了代码:
    HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc = web.Load("https://pikabu.ru/@serhiy1994");
string postDate = doc.DocumentNode.SelectSingleNode("//div[contains(@class, 'stories-feed__container')]/article[2]/div[contains(@class, 'story__main')]/div[contains(@class, 'story__footer')]/div[contains(@class, 'story__user user')]/div[contains(@class, 'user__info-item')]/time").GetAttributeValue("datetime", "NULL"); // e.g. for the 2nd article on the page

它返回 NullReferenceException .
但是,如果您停在“div class="story__user user"” 级别(例如,
    string postDate = doc.DocumentNode.SelectSingleNode("//div[contains(@class, 'stories-feed__container')]/article[2]/div[contains(@class, 'story__main')]/div[contains(@class, 'story__footer')]/div[contains(@class, 'story__user user')]").InnerHtml;

它可以正常工作并返回内部 HTML 代码。
所以我认为 HtmlAgilityPack 有“最大可见度”之类的东西,你将无法使用更深层次的 Markdown 进行操作。

我是对的还是我编码错误?

原始页面代码在这里: https://pastebin.com/jFC0XD9C

最佳答案

HtmlAgility 将抓取整个网站,无论您想走多深。您可以使用它来找到您正在寻找的项目,因为您 不要必须提供整个路径。

这将搜索整个站点并查找第一个 <div>具有类名的标签 user__info-item .您也可以更改 SelectSingleNodeSelectNodes如果有多个标签,则遍历它们以获取日期。

    HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc = web.Load("https://pikabu.ru/@serhiy1994");
var postDate = doc.DocumentNode.SelectSingleNode("//div[@class='user__info-item']/time");
Console.WriteLine(postDate.InnerText);

你的代码有什么问题?

您上面的代码不起作用的原因是因为您缺少另一个 div,' <div class="user__info user__info_left"> '。

如果您像这样编写代码,它就可以工作。
    var nodes = doc.DocumentNode.SelectSingleNode("//div[@class='story__main']/div[@class='story__footer']/div[@class='story__user user']/div[@class='user__info user__info_left']/div[@class='user__info-item']/time");
Console.WriteLine(nodes.InnerText);

另一种方式

另一种方法是搜索父 div。找到父标签后,在该标签下搜索以找到您要查找的内容。
    var nodes = doc.DocumentNode.SelectNodes("//div[@class='story__user user']");
foreach (HtmlNode node in nodes)
{
// Search within each node using .// notation
var timeNodes = node.SelectSingleNode(".//div[@class='user__info-item']/time");
Console.WriteLine(timeNodes.InnerText);
}


Tested Code here

关于c# - HtmlAgilityPack 的可见区域有多深?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581592/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com