scrapy:请求链接必须是字符串或Unicode,得到的是列表

1 投票
1 回答
5759 浏览
提问于 2025-04-18 14:24

我有点搞不清楚这段代码哪里出了问题。我想先抓取第一页的内容,然后对那一页上的每个链接,去第二页提取商品描述。当我运行下面的代码时,出现了一个错误:exception.TypeError: url必须是字符串或Unicode,但得到了列表。这是我的代码:

from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.http import Request
from scrapy.item import Item, Field
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import MapCompose,  Join
from scrapy.contrib.loader import XPathItemLoader
from my.items import myItem

class mySpider(Spider):
    name = "my"
    allowed_domains = ["my.com"]
    start_urls = ['http://sjg.my.com/cf_jy.cfm']

    def parse(self, response):
        s = Selector(response)
        rows = s.xpath('//table[@class="table-order"]//tr')
        for row in rows:
            l = XPathItemLoader(item=myItem(), selector=row)
            l.default_input_processor = MapCompose(unicode.strip)
            l.default_output_processor = Join()
            l.add_xpath('title', './/a[contains(@href,"cf_jy.cfm?hu_pg")]/text()')
            l.add_xpath('url1', './/a/@href')
            l.add_xpath('dates', './/td[4]/text()')
            l.add_xpath('rev', './/td[@align="right"]/text()')
            l.add_xpath('typ', './/td[3]/text()')
            l.add_value('name', u'gsf')
            request = Request(l.get_xpath('.//a/@href'), callback=self.parse_link,meta={'l':l})
            yield request      

    def parse_link(self, response):
        l = response.meta["l"]
        s = Selector(response)
        q = s.xpath("//div[@class='content-main']/td[@class='text']/p/text()").extract()
        l.add_value('description',q)
        yield l.load_item()

提前谢谢你。

1 个回答

1

根据Scrapy的文档,Request的第一个参数应该是一个字符串。但是在你的代码中,l.get_xpath('.//a/@href')返回的是一个列表。所以你需要只发送一个字符串给Request的url参数。

比如:

Request("Some_link_goes_here", callback=self.parse_link,meta={'l':l})

撰写回答