【问题标题】:How do I access the content of multiple <div> tags with HTMLAgilityPack?如何使用 HTMLAgilityPack 访问多个 <div> 标签的内容?
【发布时间】:2015-06-07 15:51:54
【问题描述】:

我无法在 codeplex 网站上找到 HTMLAgilityPack 的文档。目前我想做的是访问亚马逊网站上的一个 div,并抓取文本信息以在 WPF 应用程序中使用。

var getWeb = new HtmlWeb();                     
var doc = getWeb.Load(uri);
HtmlNode ourNode = doc.DocumentNode.SelectSingleNode("//div[@id = 'zg_centerListWrapper']");

这个 div 包含大约 12 个其他 div,每个 div 都是 best sellers 类别中的一个项目。

为了访问每个属性似乎很费力(而且我也不完全确定第一眼我会怎么做)。那么我应该改用DocumentNode.SelectNodes() 吗?我将如何实施它?此外,我很难相信在这么长时间之后没有HTMLAgilityPack 的文档......也许我在错误的地方寻找,因为 youtube 似乎是我目前最好的来源。

【问题讨论】:

标签: c# html wpf html-agility-pack


【解决方案1】:

其实SelectNodes()SelectSingleNode()的参数是一个xpath表达式,确切的说是xpath版本1.0(见xpath 1.0 spec here)。

XPath 是另一种技术,它有自己的规范、文档和讨论。您通常可以搜索 xpath 教程或文章而不是 HtmlAgilityPack (HAP) 细节,以便更好地了解应该将哪种表达式传递给 HAP 以获取特定的 HTML 元素。

为了举例,假设您的 HTML 如下所示:

<div id="zg_centerListWrapper">
    <div>I want this</div>
    <div>..and this</div>
    <div>..and this one too</div>
</div>

看到您感兴趣的divs 是div[@id = 'zg_centerListWrapper']直子,那么您可以使用以下xpath 来获取它们:

var xpath = "//div[@id = 'zg_centerListWrapper']/div";
HtmlNodeCollection ourNodes = doc.DocumentNode.SelectNodes(xpath);

【讨论】:

  • 谢谢,但我将如何开始访问/使用该 div 的子级。我是否必须在每个上都使用 .SelectSingleNode - 使我尝试使用“zg_centerListWrapper”的子级的初始过程毫无意义?很抱歉这样打扰你,如果有文档我不会。
  • 你可以循环遍历结果:foreach(HtmlNode node in outNodes){//do sth with each node}
  • HAP的HtmlDocumentXmlDocument的设计方式非常相似,第一个可以参考后者,在很多情况下都可以,只需要在语法上稍微调整一下(fe替换@987654332 @与Html等)
【解决方案2】:

你可以使用DocumentNode.Descendants("div"),然后像

.Where(div => div.Attributes.Contains("class") && div.Attributes["class"].Value.Contains("best category"))

但是,是的,文档肯定会有所帮助..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多