3

初めて見事に機能するクモを書きました。2回目に実行しようとしたとき、それはを超えて冒険しませんでしたstart_urlsfetchURLを入力して、返された応答からオブジェクトscrapy shellを作成しようとしました。HtmlXPathSelectorそれは私がエラーを受け取ったときです

したがって、手順は次のとおりです。`

[scrapy shell] fetch('http://example.com') #its something other than example.
[scrapy shell] from scrapy.selector import HtmlXPathSelector
[scrapy shell] hxs = HtmlXPathSelector(response)

---------------------------------------------------------------------------

トレースバック:

AttributeError                            Traceback (most recent call last)
<ipython-input-3-a486208adf1e> in <module>()
----> 1 HtmlXPathSelector(response)

/home/codefreak/project-r42catalog/env-r42catalog/lib/python2.7/site-packages/scrapy/selector/lxmlsel.pyc in __init__(self, response, text, namespaces, _root, _expr)
     29                 body=unicode_to_str(text, 'utf-8'), encoding='utf-8')
     30         if response is not None:
---> 31             _root = LxmlDocument(response, self._parser)
     32 
     33         self.namespaces = namespaces

/home/codefreak/project-r42catalog/env-r42catalog/lib/python2.7/site-packages/scrapy/selector/lxmldocument.pyc in __new__(cls, response, parser)
     25         if parser not in cache:
     26             obj = object_ref.__new__(cls)
---> 27             cache[parser] = _factory(response, parser)
     28         return cache[parser]
     29 

/home/codefreak/project-r42catalog/env-r42catalog/lib/python2.7/site-packages/scrapy/selector/lxmldocument.pyc in _factory(response, parser_cls)
     11 def _factory(response, parser_cls):
     12     url = response.url
---> 13     body = response.body_as_unicode().strip().encode('utf8') or '<html/>'
     14     parser = parser_cls(recover=True, encoding='utf8')
     15     return etree.fromstring(body, parser=parser, base_url=url)

エラー:

AttributeError: 'Response' object has no attribute 'body_as_unicode'

非常に明白なものを見落としているのでしょうか、それともスクレイプのバグに遭遇したのでしょうか?

4

1 に答える 1

9

body_as_unicodeTextResponseのメソッドです。TextResponse、またはHtmlResponseなどのサブクラスの1つは、http応答にテキストコンテンツが含まれている場合、scrapyによって作成されます。

In [1]: fetch('http://scrapy.org')
...
In [2]: type(response)
Out[2]: scrapy.http.response.html.HtmlResponse
...
In [3]: fetch('http://www.scrapy.org/site-media/images/logo.png')
...
In [4]: type(response)
Out[4]: scrapy.http.response.Response

あなたの場合、最も可能性の高い説明は、scrapyが応答にテキストが含まれていないと信じていることです。

サーバーからのHTTP応答はContent-Typeヘッダーを正しく設定していますか?ブラウザで正しくレンダリングされますか?これらの質問は、それが予想される動作なのかバグなのかを理解するのに役立ちます。

于 2013-01-19T17:03:38.180 に答える