提交 de89b1b5 编写于 作者: P Paul Tremberth 提交者: GitHub

Merge pull request #2275 from scrapy/response-css-xpath-message

[MRG+1] Add better messages for when response content isn't text (closes #2264)
......@@ -9,6 +9,8 @@ from six.moves.urllib.parse import urljoin
from scrapy.http.headers import Headers
from scrapy.utils.trackref import object_ref
from scrapy.http.common import obsolete_setter
from scrapy.exceptions import NotSupported
class Response(object_ref):
......@@ -80,3 +82,22 @@ class Response(object_ref):
"""Join this Response's url with a possible relative url to form an
absolute interpretation of the latter."""
return urljoin(self.url, url)
@property
def text(self):
"""For subclasses of TextResponse, this will return the body
as text (unicode object in Python 2 and str in Python 3)
"""
raise AttributeError("Response content isn't text")
def css(self, *a, **kw):
"""Shortcut method implemented only by responses whose content
is text (subclasses of TextResponse).
"""
raise NotSupported("Response content isn't text")
def xpath(self, *a, **kw):
"""Shortcut method implemented only by responses whose content
is text (subclasses of TextResponse).
"""
raise NotSupported("Response content isn't text")
......@@ -7,6 +7,7 @@ from scrapy.http import (Request, Response, TextResponse, HtmlResponse,
XmlResponse, Headers)
from scrapy.selector import Selector
from scrapy.utils.python import to_native_str
from scrapy.exceptions import NotSupported
class BaseResponseTest(unittest.TestCase):
......@@ -127,6 +128,18 @@ class BaseResponseTest(unittest.TestCase):
absolute = 'http://www.example.com/test'
self.assertEqual(joined, absolute)
def test_shortcut_attributes(self):
r = self.response_class("http://example.com", body=b'hello')
if self.response_class == Response:
msg = "Response content isn't text"
self.assertRaisesRegexp(AttributeError, msg, getattr, r, 'text')
self.assertRaisesRegexp(NotSupported, msg, r.css, 'body')
self.assertRaisesRegexp(NotSupported, msg, r.xpath, '//body')
else:
r.text
r.css('body')
r.xpath('//body')
class TextResponseTest(BaseResponseTest):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册