我现在正在学习草率的游戏,并且正在为房地产网站构建一个简单的游戏器。使用此代码,我试图抓取特定城市的房地产列表的所有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
请让我知道是否可以澄清任何事情。
答案 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”。更大范围内,可以帮助您节省一些内存。