我得到以下回溯,但不确定如何重构。
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
任何帮助将不胜感激
答案 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()