我得到了以下回溯,但不确定如何重构。
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任何帮助都将不胜感激
发布于 2018-10-20 06:15:20
看起来你在正确的轨道上注释掉了。
xpath().extract() #returns a list of strings您需要使用以下命令选择字符串
发布于 2018-10-20 06:22:11
row.xpath('a/@href').extract()该表达式的计算结果是一个列表,而不是一个字符串。将URL传递给请求对象时,scrapy需要的是字符串,而不是列表
要解决这个问题,您有几个选择:您可以使用LinkExtractors,它允许您在页面中搜索链接,并自动为这些链接创建无意义的请求对象:
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()而使用.extract_first()
https://stackoverflow.com/questions/52900422
复制相似问题