2015-04-23 91 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() 

与上面的代码你那里