Scrapy - ValueError: отсутствует схема в URL-адресе запроса: # mw-head - PullRequest
0 голосов
/ 20 октября 2018

Я получаю следующую трассировку, но не знаю, как выполнить рефакторинг.

ValueError: Missing scheme in request url: #mw-head

Полный код:

class MissleSpiderBio(scrapy.Spider): 

    name = 'missle_spider_bio'
    allowed_domains = ['en.wikipedia.org']
    start_urls = ['https://en.wikipedia.org/wiki/...']

эта часть вызывает у меня проблемы (я полагаю)

    def parse(self, response):
        filename = response.url.split('/')[-1]
        table = response.xpath('///div/table[2]/tbody')
        rows = table.xpath('//tr')
        row = rows[2]
        row.xpath('td//text()')[0].extract()
        wdata = {}
        for row in response.xpath('//* \
        [@class="wikitable"]//tbody//tr'):
            for link in response.xpath('//a/@href'):
                link = link.extract()
                if((link.strip() != '')):
                    yield Request(link, callback=self.parse)
                    #wdata.append(link)
                else:
                    yield None
                #wdata = {}
                #wdata['link'] = BASE_URL + 
                #row.xpath('a/@href').extract() #[0]
                wdata['link'] = BASE_URL + link 
                request = scrapy.Request(wdata['link'],\
                callback=self.get_mini_bio, dont_filter=True) 
                request.meta['item'] = MissleItem(**wdata)
                yield request

вот вторая часть кода:

    def get_mini_bio(self, response):
        BASE_URL_ESCAPED = 'http:\/\/en.wikipedia.org'
        item = response.meta['item']
        item['image_urls'] = [] 
        img_src = response.xpath('//table[contains(@class, \ 
        "infobox")]//img/@src')
        if img_src:
            item['image_urls'] = ['http:' + img_src[0].extract()]
        mini_bio = ''
        paras = response.xpath('//*[@id="mw-content-text"]/p[text()\ 
        or  normalize-space(.)=""]').extract()
        for p in paras:
            if p =='<p></p>':
                break
            mini_bio += p

        mini_bio = mini_bio.replace('href="/wiki', 'href="' + \ 
        BASE_URL + '/wiki')
        mini_bio = mini_bio.replace('href="#', item['link'] + '#')
        item['mini_bio'] = mini_bio
        yield item 

Я пробовал рефакторинг, но сейчас получаю:

ValueError: Missing scheme in request url: #mw-head

любая помощь будет очень признательна

Ответы [ 2 ]

0 голосов
/ 20 октября 2018
row.xpath('a/@href').extract()

Это выражение оценивает список, а НЕ строку.Когда вы передаете URL объекту запроса, scrapy ожидает строку, а не список

. Чтобы исправить это, у вас есть несколько вариантов: вы можете использовать LinkExtractors, которые позволят вам искать на странице ссылки и автоматическисоздайте объекты запроса scrapy для этих ссылок:

https://doc.scrapy.org/en/latest/topics/link-extractors.html

ИЛИ Вы можете запустить цикл for и перейти по каждой из ссылок:

из запроса на импорт scrapy.spiders

for link in response.xpath('//a/@href'):
    link = link.extract()
    if((link.strip() != '')):
        yield Request(link, callback=self.parse)
    else:
        yield None

Вы можете добавить к этому коду любые строковые фильтры, которые вы хотите

ИЛИ

Если вы просто хотите первую ссылку, вы можете использовать .extract_first() вместо .extract()

0 голосов
/ 20 октября 2018

Похоже, что вы были на правильном пути с закомментированным [0].

xpath().extract() #returns a list of strings

Вам нужно выбрать строку с [0]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...