c# - HtmlAgilityPack 并选择节点和子节点

标签 c# xpath html-agility-pack

希望有人能帮助我。

假设我有一个包含多个 divshtml 文档,就像这个例子:

<div class="search_hit">
    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>
</div>
<div class="search_hit">
    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>
</div>

我正在使用 HtmlAgilityPack 获取 html 文档。我需要知道的是如何获得每个 search_hit-div 的跨度?

我的第一个想法是这样的:

foreach (HtmlAgilityPack.HtmlNode node in
    doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
     foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("//span[@prop]"))
     {
     }
}

每个 div 都应该是一个包含 span 作为属性的对象:

public class Record
{
    public string Name { get; set; }
    public string company { get; set; }
    public string street { get; set; }
}

然后将填写此列表:

public List<Record> Results = new List<Record>();

但是我正在使用的 XPATH 没有像它应该做的那样在子节点中进行搜索。它一次又一次地搜索整个文档。

我的意思是我已经让它以那种方式工作,我只得到整个页面的跨度,但是我在 spansdivs 之间没有关系.意思是,我不知道哪个 span 与哪个 div 相关。

有人知道解决方案吗?我已经玩了那么多,现在我完全困惑了。 :)

感谢任何帮助!

最佳答案

如果您使用//,它会从文档开始搜索。

使用.//从当前节点开始搜索所有

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes(".//span[@prop]"))

或者完全删除前缀以仅搜索直接子代:

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("span[@prop]"))

关于c# - HtmlAgilityPack 并选择节点和子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003409/

相关文章:

c# - MVC 路由有冲突

c# - Gridview:根据同一行中单元格的值更改链接按钮文本

c# - 构建 XDocument 时出错

xpath - XQuery:如何知道是否存在双峰?

.net - 转换 Skip LINQ 方法结果的正确方法

c# - 从 asp.net 中的代码后面获取 anchor 元素的 href 属性

c# - 匿名类型的平等

java - 如何捕获亚马逊产品selenium的xpath

c# - 如何在 HtmlAgilityPack 中使用代理

c# - 指定节点范围 - Xpath/Html Agility Pack