我有以下xpath:/html/body/div/div/div/div[2]/div/div/div/div[3]/div/table/tbody/tr/td[2]/a
从:
<div id="search-result-block">
<div class="">
<table class="search-result" width="100%">
<tbody>
<tr>
<td class="result-num">
<td class="result-header" colspan="2">
<a class="srtitle" href="http://books.ioba.org/books/4359746.html">1001 Designs for Whittling and Woodcarving</a>
<br>
<div class="srauthor">Tangerman, Elmer John </div>
</td>
</tr>
<tr>
</tbody>
</table>
我需要获取该xpath的内部html,但是我的应用程序给了我一个null异常(我猜它发现路径错了或者什么)
这是我目前的代码:
HtmlAgilityPack.HtmlNode rootNode = htmlDoc.DocumentNode;
titleBook = rootNode.SelectSingleNode(@".//table/tbody/tr/td[2]/a").InnerHtml.ToString();
我尝试使用@"//table[contains(@class, 'result-header')]/a"
代替,但仍然无效。
我做错了什么?
答案 0 :(得分:1)
总而言之,我认为选择节点的最简单方法是
//a[@class='srtitle']
但是你的HTML非常混乱......例如,缺少一些匹配的标签会导致行为不可预测。
你的第一条路径不起作用,因为两个td
似乎实际上是嵌套的,而不是兄弟姐妹:它应该是@"//table/tbody/tr/td/td/a"
。
第二个xpath可以使用@"//td[@class="result-header']/a
进行简化和修复,或者如果您需要@"//td[contains(@class, 'result-header')]/a"
。
答案 1 :(得分:0)
我认为你已经有了解决方案,但这里有一个LINQ-esq库,用于为类似情况生成xpath表达式。
http://www.unit-testing.net/CurrentArticle/How-to-Create-Xpath-From-Lambda-Expressions.html