为什么//需要而不是/

时间:2013-11-25 12:22:59

标签: xpath scrapy

考虑以下HTML代码:

<html>
<head>      
  <title>Example website</title>
</head>
 <body>    
  <div>
  <table id='tableid'>
   <tr>
    <td>
        <a href="/blabla" title="Blabla1">Blabla1</a>
        <a href="/blabla" title="Blabla1">Blabla2</a>
        <a href="/blabla" title="Blabla1">Blabla3</a>
        <a href="/blabla" title="Blabla1">Blabla4</a>
    </td>
        <td>col2</td>
        <td>col3</td>
        <td>col4</td>
   </tr>
  </table>
 </body>
</html>

如果我想获得所有链接,为什么我必须使用:

//table[@id="tableid"]//a/@href

相反,如果使用单个/表后?那时我在表节点上已经完成了(它应该成为我的'root')所以/应该足够......

提前感谢!

2 个答案:

答案 0 :(得分:4)

如果你只想要/的直接孩子,table[@id="tableid"]之后的单table就可以了。要获得a的任何后代table[@id="tableid"],您需要//a

///descendant-or-self::node()/

的缩写

descendant-or-self轴包含上下文节点和上下文节点的后代。由于您将上下文节点建立为table[@id="tableid"],因此除了a的后代之外,您不会获得任何table[@id="tableid"]个元素。

答案 1 :(得分:3)

//table[@id="tableid"]

将找到<table>等于id的所有tableid元素。

//a/@href

在此之后添加将在<a>元素中找到所有<table>元素,在任何位置(子,孙......)

如果您确定所需的所有<a>元素都低于第一个<td>(表格 - &gt; tr - &gt; td),则可以跳过第二个//和做:

//table[@id="tableid"]/tr[1]/td[1]/a/@href

/tr[1]/td[1]将直接转到<a>元素。