首页 > 解决方案 > Xpath 只给我第一个项目,而我想要所有项目(使用 Scrapy)

问题描述

我正在使用 Scrapy 从该页面 (Booking)中抓取结果。我们的想法是获取页面中所有酒店的所有 URL。

在我的 Scrapy 中的蜘蛛中,我放了:

def __init__(self, *args, **kwargs):
    super(BookingScoreSpider, self).__init__(*args, **kwargs)
    self.start_urls = [kwargs.get('start_url')]

def parse(self, response):
    global url
    print(response.xpath('normalize-space(//a[@class="hotel_name_link url"]/@href)'))
    for hotelurl in response.xpath('normalize-space(//a[@class="hotel_name_link url"]/@href)'):
        url = response.urljoin(hotelurl.extract())
        print(url)

但是循环似乎只包含一个元素(第一家酒店)......所以蜘蛛正在工作,我得到了第一家酒店的 URL,但循环没有继续,好像蜘蛛只找到了一个类“hotel_name_link url”...当我检查网页时,我发现很多这样的项目。

你能帮助我吗 ?

标签: pythonxpathscrapy

解决方案


您使用的是 XPath 1.0(遗憾的是,scrapy 在这里使用了 20 年的技术),在 XPath 1.0 中,应用于节点集的 normalize-space() 会忽略节点集中除第一个节点之外的所有节点。(在当前版本的 XPath 3.1 中,您可以//a[...] ! normalize-space()将其应用于每个节点并返回一系列字符串。

您最好的选择可能是取出 normalize-space(),返回未标准化的节点,然后在调用代码中处理它们。


推荐阅读