Scrapy选择器返回页面上的所有内容而不是相对

时间:2015-06-25 12:23:39

标签: python css xpath web-scraping scrapy

我正在使用Scrapy抓取一个网站,其上有一个项目列表。但是,当循环遍历项目列表时,要求相对xpath将返回整个页面的所有匹配项。我一直在使用0.24,但升级到最新版(1.0)遇到了同样的问题。

我尝试使用virtualenv运行此操作,以避免与我系统上的其他库发生冲突,但没有成功。

for sel in response.xpath('//ul[@class="items"]//div[@class="item"]'):
    item = CrawledItem()
    item['id'] = sel.xpath('.//input[@name="id"]/@value').extract()

我已经尝试使用scrapy parse进行调试,并注意到id列表以所有匹配开始,然后慢慢减少,所以最后一项只匹配一个id。我期待每个项目有一个id,而不是我得到类似下面的响应。

[
    {
        'id': [1,2,3,4,5,6,7,8,9,10]
    },
    {
        'id': [1,2,3,4,5,6,7,8,9]
    },
    [..] // omitted
    {
        'id': [10]
    }
]

我也尝试过使用css选择器但没有成功。我的理解是.//用于执行此操作。如何确保我只选择相对于当前选择器?

1 个答案:

答案 0 :(得分:1)

  

如何确保我只选择相对于当前的选项   选择?

明智地选择你的选择; - )

事实上,该页面的行为与直觉相反,似乎相对选择不起作用。正如我检查过的那样,您可以使用以下代码获取productId,该代码使用更深层次的嵌套选择器:

from scrapy import Spider

class TestSpider(Spider):

    name= 'test_spider'
    start_urls = ['http://www.sainsburys.co.uk/shop/gb/groceries/meat-fish/ham-82654-44']

    def parse(self, response):

        # print response.body

        xpath_products = '//div[@class="addToTrolleyForm "]'

        for sel in response.xpath(xpath_products):
            src = sel.xpath('.//input[@name="productId"]/@value').extract()
            print src

虽然没有为您的问题提供解决方案 - 抱歉,我建议您仔细检查回复。