2017-02-14 52 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。 –