HtmlAgilityPack-XPath:在特定节点之后选择节点序列,直到具有特定后代的节点为止

时间:2019-01-08 15:49:56

标签: vb.net xpath html-agility-pack

我想使用XPath选择一个包含强子标记的p标记,并将其作为键放在键值对中。我想要跟随p标签直到遇到下一个强标签的值。

不幸的是,我正在处理的HTML并不是我自己的,因此我无法修改其结构以使其更简单。如果文本是已知的,我将看到以这种方式使用XPath的几个示例,但是在这种情况下,特定的文本是可变的。

以下是简化的HTMl的相关部分:

<div class="div_1"> 
 <div class="div_2">
   <p><em><strong>Title 1</strong></em> Some Text</p>
   <p>Some Text <a class="tooltip">Some Text</a></p>
   <p>Some Text <a class="tooltip">Some Text</a></p>
   <p>Some Text <a class="tooltip">Some Text</a></p>
   <p><em><strong>Title 2</strong></em> Some Text.</p>                
  </div>
</div>

这是我在VB中尝试的方法:

For Each trait_head As HtmlAgilityPack.HtmlNode In content.DocumentNode.SelectNodes(
        "//div[@class='div_1']/div[@class='div_2']/p/em/strong")
            trait_heading = trait_head.InnerText
            trait_heading = trait_heading.Trim().Replace(vbCr, "").Replace(vbLf, "")
            For Each trait_bod As HtmlAgilityPack.HtmlNode In content.DocumentNode.SelectNodes(
            "//div[@class='div_1']/div[@class='div_2']/p")
                If trait_body Is Nothing Then
                    trait_body = trait_bod.InnerText
                Else
                    trait_body = trait_body & vbCr & vblf & trait_bod.InnerText
                End If
            Next
trait_value.add(New KeyValuePair(Of String, String)(trait_heading, trait_body))
Next 

因此,我需要修改的是第二个XPath语句,以使for循环一旦以strong命中第二个p标签就中断了。

寻找此结果:
trait_value =“标题1” =>“某些文本vbcr vblf一些文本vbcr vblf一些文本vbcr vblf一些文本vbcr vblf”,“标题2” =>“某些文本”

希望我在这里要问的只是使用XPath是可能的,但是如果有人完全对另一种方法有建议,我将很高兴听到他们的建议。

1 个答案:

答案 0 :(得分:0)

最终结果:

For Each trait_head As HtmlAgilityPack.HtmlNode In content.DocumentNode.SelectNodes(
        "//div[@class='div_1']/div[@class='div_2']/p/em/strong")
            trait_heading = trait_head.InnerText
            trait_heading = trait_heading.Trim().Replace(vbCr, "").Replace(vbLf, "")
            For Each trait_bod As HtmlAgilityPack.HtmlNode In content.DocumentNode.SelectNodes(
            "//div[@class='div_1']/div[@class='div_2']/p[em/strong]")
                If trait_body Is Nothing Then
                    trait_body = trait_bod.LastChild
                Else
                    trait_body = trait_body & vbCr & vblf & trait_bod.LastChild
                End If
            Next
trait_value.add(New KeyValuePair(Of String, String)(trait_heading, trait_body))
Next