2015-04-23 37 views
0

我正在使用scrapy來提取數據。 有數以千計的產品,我刮 問題是這些網頁上的數據是不一致的 即。Xpath在scrapy中滿足條件時獲取數據

<table class="c999 fs12 mt10 f-bold"> 
             <tbody><tr> 
          <td width="16%">Type</td> 
          <td class="c222">Kurta</td> 
         </tr> 
                <tr> 
           <td>Fabric</td> 
           <td class="c222">Cotton</td> 
          </tr> 
                            <tr> 
           <td>Sleeves</td> 
           <td class="c222">3/4th Sleeves</td> 
          </tr> 
                            <tr> 
           <td>Neck</td> 
           <td class="c222">Mandarin Collar</td> 
          </tr> 
                            <tr> 
           <td>Wash Care</td> 
           <td class="c222">Gentle Wash</td> 
          </tr> 
                            <tr> 
           <td>Fit</td> 
           <td class="c222">Regular</td> 
          </tr> 
                            <tr> 
           <td>Length</td> 
           <td class="c222">Knee Length</td> 
          </tr> 
                                 <tr> 
           <td>Color</td> 
           <td class="c222">Brown</td> 
          </tr> 
                            <tr> 
           <td>Fabric Details</td> 
           <td class="c222">Cotton</td> 
          </tr> 
                                               <tr> 
          <td> 
           Style       </td> 
          <td class="c222"> Printed</td> 
         </tr> 
                            <tr> 
         <td> 
          SKU      </td> 
         <td id="qa-sku" class="c222"> SR227WA70ROJINDFAS</td> 
        </tr> 

                <tr> 
         <td></td> 

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

所以這些行不一致。 有時「類型」處於第一位,有時候處於第二位。 我寫了代碼循環訪問值並比較第一個td的值,如果它是「類型」獲取其相應的td的值,但它不工作 這是代碼。

table_data = response.xpath('//*[@id="productInfo"]/table/tr') 
     for data in table_data: 
      name = data.xpath('td/text()').extract() 

我該怎麼辦?

+0

Plese提供此頁面的網址?或者你想從這個頁面得到什麼樣的輸出? – Jithin

+0

你可以來討論 –

回答

0

您可以嘗試使用以下XPath:

name = data.xpath("td[position()=(count(../../tr/td[.='Type']/preceding-sibling::td)+1)]/text()").extract() 

以上的XPath過濾器的位置<td>,只有<td>在等於<td>Type</td>位置的位置返回。通過計算<td>Type</td>的位置來計算它的前兄弟<td>加上一個的數量。

+0

不工作的傢伙:( –

0

試試這個,

In [29]: response.xpath('//table[@class="c999 fs12 mt10 f-bold"]/tr[contains(td/text(), "Type")]/td[contains(text(), "Type")]/following-sibling::td/text()|//table[@class="c999 fs12 mt10 f-bold"]/tr[contains(td/text(), "Type")]/td[contains(text(), "Type")]/preceding-sibling::td/text()').extract() 
Out[29]: [u'Kurta'] 

無論td是否Type後或Type之前到來,這將工作。

0

如果你想獲得的td兄弟節點包含字符串「類型」不管這是什麼td的位置,你可以嘗試下面的XPath:

//td[contains(text(),'Type')]/following-sibling::td/text() 
0
//table/tbody/tr/td[.="Fabric"]/../td[2]/text() 

與上面的代碼你那裏