【问题标题】:Scrapy selectors return all on page instead of relativeScrapy 选择器在页面上返回所有而不是相对
【发布时间】:2015-09-12 01:21:01
【问题描述】:

我正在使用 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 选择器,但没有成功。我的理解是.// 用于执行此操作。如何确保我只选择相对于当前选择器的选择?

【问题讨论】:

  • 你能给我们你正在解析的网址吗?
  • 很可能,问题出在//ul[@class="items"]//div[@class="item"] 表达式中。带有class="item"divs 可能比您预期的要多。
  • 我在 chrome 中通过 inspect elementscrapy shell 进行了检查,它返回了我所期望的结果
  • 你可以分享你正在抓取的网站网址吗?
  • 这是这个页面:sainsburys.co.uk/shop/gb/groceries/meat-fish/ham-82654-44 我改变了问题中的 sn-p,但我试图从表单元素中获取 productId。作为单独的项目。

标签: python css xpath web-scraping scrapy


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多