从网页中的表中获取XPATH

时间:2014-02-19 19:46:51

标签: c# html visual-studio-2012 xpath

我有以下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"代替,但仍然无效。 我做错了什么?

2 个答案:

答案 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