Scrapy Extract方法产生“无法混合str和非str参数错误

时间:2019-01-16 02:59:54

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

我现在正在学习草率的游戏,并且正在为房地产网站构建一个简单的游戏器。使用此代码,我试图抓取特定城市的房地产列表的所有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

请让我知道是否可以澄清任何事情。

2 个答案:

答案 0 :(得分:2)

您正在将props字符串列表传递给response.urljoin(),但实际上是prop的意思:

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

答案 1 :(得分:0)

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”。更大范围内,可以帮助您节省一些内存。