首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scrapy - ValueError:请求url中缺少方案:#mw-head

Scrapy - ValueError:请求url中缺少方案:#mw-head
EN

Stack Overflow用户
提问于 2018-10-20 06:02:22
回答 2查看 110关注 0票数 0

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

代码语言:javascript
复制
ValueError: Missing scheme in request url: #mw-head

完整代码:

代码语言:javascript
复制
class MissleSpiderBio(scrapy.Spider): 

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

这就是给我带来问题的部分(我相信)

代码语言:javascript
复制
    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

下面是代码的第二部分:

代码语言:javascript
复制
    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 

我尝试过重构,但现在得到了一个:

代码语言:javascript
复制
ValueError: Missing scheme in request url: #mw-head

任何帮助都将不胜感激

EN

回答 2

Stack Overflow用户

发布于 2018-10-20 06:15:20

看起来你在正确的轨道上注释掉了。

代码语言:javascript
复制
xpath().extract() #returns a list of strings

您需要使用以下命令选择字符串

票数 0
EN

Stack Overflow用户

发布于 2018-10-20 06:22:11

代码语言:javascript
复制
row.xpath('a/@href').extract()

该表达式的计算结果是一个列表,而不是一个字符串。将URL传递给请求对象时,scrapy需要的是字符串,而不是列表

要解决这个问题,您有几个选择:您可以使用LinkExtractors,它允许您在页面中搜索链接,并自动为这些链接创建无意义的请求对象:

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

或者,您可以运行for循环并遍历每个链接:

来自scrapy.spiders导入请求

代码语言:javascript
复制
for link in response.xpath('//a/@href'):
    link = link.extract()
    if((link.strip() != '')):
        yield Request(link, callback=self.parse)
    else:
        yield None

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52900422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档