【问题标题】:Scrapy Extract method yields a Cannot mix str and non-str arguments errorScrapy Extract 方法产生不能混合 str 和非 str 参数错误
【发布时间】:2019-01-16 02:59:53
【问题描述】:

我现在正在学习 scrappy,并且正在构建一个简单的房地产网站抓取工具。使用此代码,我试图抓取特定城市房地产列表的所有 URL。我的代码遇到了以下错误 - “不能混合 str 和非 str 参数”。

我相信我已经将我的问题与我的部分代码隔离了

props = response.xpath('//div[@class = "address ellipsis"]/a/@href').extract()

如果我在props xpath 分配中使用extract_first() 函数而不是extract 函数,那么代码就可以工作。它抓取每个页面上属性的第一个链接。然而,这最终不是我想要的。如果我使用 extract_first() 方法,我相信我的 xpath 调用正确,因为代码运行。

有人可以解释我在这里做错了什么吗?我在下面列出了我的完整代码

import scrapy
from scrapy.http import Request

class AdvancedSpider(scrapy.Spider):
    name = 'advanced'
    allowed_domains = ['www.realtor.com']
    start_urls = ['http://www.realtor.com/realestateandhomes-search/Houston_TX/']

def parse(self, response):
    props = response.xpath('//div[@class = "address ellipsis"]/a/@href').extract()

    for prop in props:
        absolute_url = response.urljoin(props)
        yield Request(absolute_url, callback=self.parse_props)

    next_page_url = response.xpath('//a[@class = "next"]/@href').extract_first()
    absolute_next_page_url = response.urljoin(next_page_url)
    yield scrapy.Request(absolute_next_page_url)



def parse_props(self, response):
    pass

如果我能澄清任何事情,请告诉我。

【问题讨论】:

    标签: python-3.x web-scraping scrapy


    【解决方案1】:

    您将props 字符串列表传递给response.urljoin(),但意味着prop

    for prop in props:
        absolute_url = response.urljoin(prop)
    

    【讨论】:

      【解决方案2】:

      Alecxe 是对的,这是对循环中迭代器拼写的简单疏忽。您可以使用以下符号:

      for prop in response.xpath('//div[@class = "address ellipsis"]/a/@href').extract():
          yield scrapy.Request(response.urljoin(prop), callback=self.parse_props)
      

      它更简洁,并且您没有在每个循环中实例化“absolute_url”。在更大的范围内,会帮助您节省一些内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-19
        • 2015-10-06
        • 2021-02-06
        • 2016-10-22
        • 1970-01-01
        • 2018-02-17
        • 2021-06-18
        • 1970-01-01
        相关资源
        最近更新 更多