Scrapy-ValueError:请求网址中缺少方案:#mw-head

时间:2018-10-19 22:02:22

标签: python scrapy

我得到以下回溯,但不确定如何重构。

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 :(得分:0)

看起来您在正确的轨道上并被注释掉[0]。

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

您需要选择[0]作为字符串

答案 1 :(得分:0)

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

您可以在该代码中添加所需的任何字符串过滤器

OR

如果只需要第一个链接,则可以使用.extract_first()代替.extract()