2014-03-26 175 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的直接子。