关于python:Scrapy错误:exceptions.AttributeError:’HtmlResponse’对象没有属性’urljoin’

Scrapy error : exceptions.AttributeError: 'HtmlResponse' object has no attribute 'urljoin'

我已经使用pip安装了scrapy,并尝试了scrapy文档中的示例。

我得到了错误cannot import name xmlrpc_client

在研究了一个StachoverFlow问题之后我已经用修好了

1
2
3
sudo pip uninstall scrapy

sudo pip install scrapy==0.24.2

但现在我看到了EDOCX1[1]

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import scrapy


class StackOverflowSpider(scrapy.Spider):
    name = 'stackoverflow'
    start_urls = ['https://stackoverflow.com/questions?sort=votes']

    def parse(self, response):
        for href in response.css('.question-summary h3 a::attr(href)'):
            full_url = response.urljoin(href.extract())
            yield scrapy.Request(full_url, callback=self.parse_question)

    def parse_question(self, response):
        yield {
            'title': response.css('h1 a::text').extract()[0],
            'votes': response.css('.question .vote-count-post::text').extract()[0],
            'body': response.css('.question .post-text').extract()[0],
            'tags': response.css('.question .post-tag::text').extract(),
            'link': response.url,
        }

有人能帮我吗?


在scrapy>=0.24.2,不但有urljoin()HtmlResponse类的方法。urlparse.urljoin()直接使用:

1
full_url = urlparse.urljoin(response.url, href.extract())

不要忘了给它的进口

1
import urlparse

请注意,urljoin()别名/辅助是由scrapy 1.0中,这里的问题是相关的:

  • response.urljoin附加(辅助)

它实际上是和这里的是什么样的。

1
2
3
4
5
6
from six.moves.urllib.parse import urljoin

def urljoin(self, url):
   """Join this Response's url with a possible relative url to form an
    absolute interpretation of the latter."""

    return urljoin(self.url, url)


该代码示例使用的是你的scrapy 1.0。因为你downgraded至0.24,你需要使用urljoin:从urlparse

1
full_url = urljoin(response.url, href.extract())

如果你点击"scrapy 0.24(旧的稳定)"按钮上面的例子的例子代码,你把你的scrapy版使用。