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

时间:2014-03-01 16:24:45

标签: python html xpath scrapy

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

我如何让它工作并按照第一页的链接从链接中提取数据?任何例子都会很棒。

2 个答案:

答案 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)