2017-02-14 21 views
0

このHTMLを解析しようとしています。XpathとCSSセレクタでScrapyが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にいくつかのTRを持っていると私は、各レコード(実際にはTR)、その後、各レコードのプロセスの詳細を処理したい各tr

内部tableを持っています。

私はこれらのセレクタ/ Xpathを試しました。

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 Sを選択した場合。

これは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を使用してスクレイピングすると、tbodyはHTMLのresponseには含まれませんでした。

+0

重要な部分は、xpathを使用して横断する生のhtml構造に "tbody"が存在しないことです。ブラウザによって自動的にDOMに追加されます。 –