【发布时间】:2015-03-06 06:07:53
【问题描述】:
我有一个特殊的问题。当我尝试将 Xpath 应用于 HtmlAgility.HtmlDocument 时,它不起作用。但是当我使用同一个文档的内部 html 并创建另一个 HtmlAgility.HtmlDocument 对象时,找到了匹配项。任何想法都将不胜感激。
Dim ret As String = Nothing
Dim tmpHtmlNode As HtmlNode = _pageHTML.DocumentNode.SelectSingleNode(token.MatchingXPath)
If tmpHtmlNode IsNot Nothing AndAlso tmpHtmlNode.InnerText IsNot Nothing Then ' THIS FETCHES NULL'
ret = tmpHtmlNode.InnerText.Trim
End If
Dim x As New HtmlAgilityPack.HtmlDocument
x.LoadHtml(_pageHTML.DocumentNode.InnerHtml)
Dim node As HtmlNode = Nothing
node = x.DocumentNode.SelectSingleNode(token.MatchingXPath)
Console.WriteLine(node.InnerText) ' THIS WORKS'
在上述代码中,tmpHtmlNode 在评估 XPath 后为 NULL。而下面的 node 返回所需的文本。
使用的 Xpath 是 "//*[contains(text(),'Number of Discs:')]/following-sibling::text()",预期匹配的 Html 部分是:
<h2>Product Details</h2>
<div class="content">
<ul>
<li><b>Performer:</b> <a href="/s/ref=dp_db_clas_perf?ie=UTF8&keywords=Royal%20Scots%20Dragoon%20Guards&search-alias=classical">Royal Scots Dragoon Guards</a></li>
<li><b>Audio CD</b> (March 24, 1992)</li>
<li><b>Number of Discs:</b> 1</li>
<li><b>Label:</b> RCA</li>
<li><b>ASIN:</b> B000002WEN</li>
<li><b>Average Customer Review:</b>
<li id="SalesRank">
<b>Amazon Best Sellers Rank:</b>
#68,703 in Music (<a href="http://www.amazon.com/best-sellers-music-albums/zgbs/music/ref=pd_dp_ts_m_1">See Top 100 in Music</a>)
</li>
</ul>
<span class="tiny">
<ul class="noteBullets">
</ul>
</span>
</div>
【问题讨论】:
-
InnerHtml不包含与原始HtmlDocument相同的 HTML 标记,请改为检查OuterHtml。另外,发布失败的 XPath.. -
OuterHtml也不起作用。这是 xpath://*[contains(text(),'Number of Discs:')]/following-sibling::text() -
我建议将 XPath 的第一位更改为:
//*[contains(.,'Number of Discs:')]。这只是一个猜测,请发布 HTML 的相关部分,以便我们测试并查看 XPath 失败的原因和原因 -
谢谢。使用
.至少我在XPath//*[contains(.,'Number of Discs:')]的第一条路径上得到一个匹配,但下一个匹配following-sibling::text()返回一个空字符串。 html是<li><b>Number of Discs:</b> 1</li> -
@Kallol XPath 测试人员显示您的原始 XPath 对 HTML sn-p 张贴有效。因此,我几乎可以肯定您的实际 HTML 包含与此处发布的不同的标记。尝试将
HtmlDocument保存到文件中,然后打开文件确认它是否包含不同的HTML..
标签: vb.net xpath html-agility-pack