exceptions.TypeError: Request url must be str or unicode, got list:
以上是我正在接受的错误,是我的缩进吗?
这是我的代码。
from scrapy.spider import BaseSpider
from bathUni.items import BathuniItem
from scrapy.selector import HtmlXPathSelector
from scrapy.http.request import Request
from urlparse import urljoin
class recursiveSpider(BaseSpider):
name = 'recursive2'
allowed_domains = ['http://www.bristol.ac.uk/']
start_urls = ['http://www.bristol.ac.uk/international/countries/']
def parse(self, response):
hxs = HtmlXPathSelector(response)
links = []
for i in range(1, 154):
xpath = ('//*[@id="all-countries"]/li[*]/ul/li[*]/a/@href' .format (i+1))
link = hxs.select(xpath).extract()
links.append(link)
for link in links:
yield Request(link, callback=self.parse_linkpage)
def parse_linkpage(self, response):
hxs = HtmlXPathSelector(response)
item = BathuniItem()
item ['Qualification'] = hxs.select('//*[@id="uobcms-content"]/div/div/div[1]/p[2]').extract()
yield item
我如何让它工作并按照第一页的链接从链接中提取数据?任何例子都会很棒。
答案 0 :(得分:2)
基于scrapy
API,hxs.seletct(...).extract()
会返回一个列表。因此,在您的代码中,links
是列表列表,因此对Request(link,...)
的调用失败,因为link
应该是字符串或unicode。
如果您确定只想处理来自extract()
的第一个结果,则只需更改links
的附加方式即可:
links.append(link[0])
如果您要处理extract()
的所有结果,请将append
更改为:
links.extend(link)
此外,我不确定您在yield
中使用parse_linkpage
的原因。由于该函数中没有循环,yield
的行为或多或少与return
相似(而return
将更加传统和高效)。请注意,parse_linkpage
也会返回一个列表(同样是extract()
的结果)。
答案 1 :(得分:0)
检查起始URL并检查HTML后,不需要范围循环。通过足够合格的xpath查询,可以在单个select语句中提取每个国家/地区的所有相对URL。
为此,我清理了parse
功能。解析了所有必需的国家/地区网址,但我不太确定每个国家/地区页面的哪个部分需要被删除,因此项目仍为空。
class recursiveSpider(BaseSpider):
name = 'recursive2'
allowed_domains = ['bristol.ac.uk']
start_urls = ['http://www.bristol.ac.uk/international/countries/']
def parse(self, response):
hxs = HtmlXPathSelector(response)
links = hxs.select('//*[@id="all-countries"]/li/ul/li/a/@href').extract()
abs_links = ['http://www.bristol.ac.uk' + x for x in links]
for link in abs_links:
yield Request(link, callback=self.parse_linkpage)