2017-02-14 95 views
0

我想解析這個HTML。Scrapy不處理Xpath和CSS選擇器中的TBODY

<table id="ctl00_LeftColumnMiddle_Table1" border="0"> 
    <tbody> 
     <tr> 
      <td> 
       <table border="0"> 
        <tbody> 
         <tr> 
          <td >Contractor Name</td><td>UNITED RENTALS HIGHWAY TECHNOLOGIES INC</td> 
         </tr> 

        </tbody> 
       </table> 
      </td> 
     </tr> 
     <tr> 
      <td><table border="0"> 
        <tbody> 
         <tr> 
          <td >Contractor Name</td><td>UNITED RENTALS NORTHWEST INC</td> 
         </tr> 

        </tbody> 
       </table> 

      </td> 
     </tr> 
    </tbody> 
</table> 

它有幾個#ctl00_LeftColumnMiddle_Table1 TRS和具有table每個tr

我要處理的每個記錄(事實上是一個TR),然後每個記錄的過程細節裏面。

我試過這些選擇器/ Xpaths。

Selector(response).xpath('//*[@id="ctl00_LeftColumnMiddle_Table1"]/tbody/tr') 

Selector(response).css('#ctl00_LeftColumnMiddle_Table1 > tbody >tr') 

但這不返回任何結果。

但如果我這樣做

Selector(response).css('#ctl00_LeftColumnMiddle_Table1 tr') 

但這種表達也與Contractor Name太多選擇內tr秒。

這是Scrapy中的錯誤嗎?

如果是這樣,有沒有其他方式來處理記錄我想要的方式?

+0

'tbody'是自動生成一個標籤,所以你最好避免選擇 – Andersson

回答

-1
In [2]: from scrapy.selector import Selector 

In [3]: sel = Selector(text=text) 

In [4]: sel.xpath('//*[@id="ctl00_LeftColumnMiddle_Table1"]/tbody/tr') 
Out[4]: 
[<Selector xpath='//*[@id="ctl00_LeftColumnMiddle_Table1"]/tbody/tr' data='<tr>\n   <td>\n    <t'>, 
<Selector xpath='//*[@id="ctl00_LeftColumnMiddle_Table1"]/tbody/tr' data='<tr>\n   <td><table border="0">\n'>] 

你xpath的作品。

請使用view(response)在瀏覽器中打開響應,確保標籤存在於響應中。

0

Selector(response).xpath('//*[@id="ctl00_LeftColumnMiddle_Table1"]/tr') 

Selector(response).css('#ctl00_LeftColumnMiddle_Table1 > tr') 

這是因爲tbody是像Firefox和Chrome瀏覽器自動添加標籤做到了。

但是當用Scrapy抓取時,tbodyresponse HTML中沒有。

+0

最重要的部分是,「TBODY」可能不會在你穿越了使用XPath原始HTML結構中存在使用它。它由瀏覽器自動添加到DOM。 –