如果在scrapy中满足条件,则Xpath获取数据

时间:2015-04-23 06:52:20

标签: python xpath web-scraping 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>

所以这些行不一致。 有时&#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()

我该怎么办?

4 个答案:

答案 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']

无论tdType还是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()

使用上面的代码