2014-03-26 178 views
2

我试图用Scrapy刮一张表,并且遇到了一个问题,由于表的结构,我得到了太多的子节点。Scrapy抓取元素太深

举例来说,有在TD一台后面的表,有点像这样:

<table> 
    <tr> 
     <td> 
      Text I want 
     </td> 
     <td> 
      <table> 
       <tr> 
        <td> 
         Text I do not want 
        </td> 
       </tr> 
     </td> 
</table> 

所以,当我告诉它抓住:

td[1]/text() 

它抓住文本在每个tr的第一个td中 - 这正是我想要的 - 但有些tds有自己的表!不要问我为什么他们这样建造这个东西,或者为什么没有比表级本身更深层次的类或id,但事实就是这样。所以我也在表格中的第一个td中返回文本...这是在我不想要的后期tds中(还)。

如果没有ID或类,我怎么能更具体地关注只需要第一个td的文本而不是表中更深层的任何东西?

回答

2

有几个选项以继续:

  • 使用相关的XPath到顶级td(没有绝对//,将导致递归搜索):

    /path_to_table/table/tr/td[1]/text() 
    
  • 检查td有只有一个table其中的祖先:

    //td[count(ancestor::table) = 1]/text() 
    

希望有帮助。

2

我想这是因为你有这样的地方在您的查询:

table//td[1]/text() 

//td意味着找到所有td在孩子的任何水平。

将其更改为:

table/tr/td[1]/text() 

,或者如果你有tbody

table/tbody/tr/td[1]/text() 

这将让td S的是你table的直接子。