[英]Xpath get data if conditions is satisfied in scrapy
我正在使用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的值(如果它是“ Type”),则获取其对应td的值,但它不起作用。这是代码。
table_data = response.xpath('//*[@id="productInfo"]/table/tr')
for data in table_data:
name = data.xpath('td/text()').extract()
我该怎么办??
您可以尝试使用以下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>
加1来获得位置。
尝试这个,
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
之前,都可以。
如果要获取包含字符串“ Type”的td
同级节点,无论此td
处于什么位置,都可以尝试使用xpath:
//td[contains(text(),'Type')]/following-sibling::td/text()
//table/tbody/tr/td[.="Fabric"]/../td[2]/text()
上面的代码做了吗
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.