这段代码应该使用从scrapy抓取的链接来提取第一个div中的第二段,但我收到此错误


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的行为或多或少类似于returnreturn会更传统和高效)。请注意,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)

最新更新