Метод Scrapy Extract выдает ошибку Cannot mix str и non-str. - PullRequest
0 голосов
/ 16 января 2019

Я сейчас нахожусь в процессе изучения лоскутков и строю простой скребок сайта по недвижимости.С помощью этого кода я пытаюсь очистить все URL-адреса для списка недвижимости определенного города.Я столкнулся со следующей ошибкой с моим кодом - «Невозможно смешать аргументы str и non-str».

Я полагаю, что я выделил свою проблему для следующей части моего кода

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

Если я использую функцию extract_first () вместо функции extract в назначении props xpath, вид кодаработ.Он захватывает первую ссылку для свойства на каждой странице.Тем не менее, это в конечном итоге не то, что я хочу.Я полагаю, что у меня правильный вызов xpath, так как код выполняется, если я использую метод extract_first ().

Может кто-нибудь объяснить, что я делаю здесь неправильно?Я перечислил мой полный код ниже

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 голосов
/ 18 января 2019

Алекса прав, это был простой контроль написания итератора в вашем цикле. Вы можете использовать следующие обозначения:

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

Это чище, и вы не создаете экземпляр "absolute_url" за цикл. В более широком масштабе, это поможет вам сэкономить память.

0 голосов
/ 16 января 2019

Вы передаете props список строк на response.urljoin(), но вместо этого prop:

for prop in props:
    absolute_url = response.urljoin(prop)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...