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
我将如何使其工作并按照第一页的链接从链接中提取数据?任何例子都会很棒。
基于 scrapy
API,hxs.seletct(...).extract()
返回一个列表。因此,在您的代码中,links
是列表列表,因此对Request(link,...)
的调用失败link
因为应该是字符串或 unicode。
如果您确定只想处理 extract()
的第一个结果,您可以简单地更改附加到links
的方式,如下所示:
links.append(link[0])
如果要处理来自 extract()
的所有结果,请将append
更改为:
links.extend(link)
另外,我不确定您为什么在parse_linkpage
中使用yield
.由于该函数中没有循环,因此yield
的行为或多或少类似于return
(return
会更传统和高效)。请注意,parse_linkpage
还将返回一个列表(再次返回 extract()
的结果)。
检查了起始 URL 并检查了 HTML,范围循环是不必要的。使用足够限定的 xpath 查询,可以在单个选择语句中提取每个国家/地区的所有相对 URL。
为此,我已经清理了parse
函数。所有必需的国家/地区 URL 都被解析,但我不太确定需要抓取每个国家/地区页面的哪个部分,因此这些项目仍然是空的。
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)