我正在使用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>
所以这些行不一致。 有时&#34; Type&#34;是第一个位置,有时是第二个位置。 我编写了代码来循环遍历值并比较1st td的值,如果它是&#34; Type&#34;获取其相应td的值但它不起作用 这是代码。
table_data = response.xpath('//*[@id="productInfo"]/table/tr')
for data in table_data:
name = data.xpath('td/text()').extract()
我该怎么办?
答案 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>
的位置。
答案 1 :(得分: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
之后,这都行。
答案 2 :(得分:0)
如果您想获取td
的同级节点,其中包含字符串&#39; Type&#39;无论这个td
的位置是什么,你都可以尝试跟随xpath:
//td[contains(text(),'Type')]/following-sibling::td/text()
答案 3 :(得分:0)
//table/tbody/tr/td[.="Fabric"]/../td[2]/text()
使用上面的代码