返回介绍

3.2 Response 内置 Selector

发布于 2024-02-05 21:13:20 字数 1615 浏览 0 评论 0 收藏 0

在实际开发中,几乎不需要手动创建Selector对象,在第一次访问一个Response对象的selector属性时,Response对象内部会以自身为参数自动创建Selector对象,并将该Selector对象缓存,以便下次使用。Scrapy源码中的相关实现如下:

class TextResponse(Response):

 def __init__(self, *args, **kwargs):
  ...
  self._cached_selector = None
  ...

 @property
 def selector(self):
  from scrapy.selector import Selector
  if self._cached_selector is None:
    self._cached_selector = Selector(self)
  return self._cached_selector
 ...

通常,我们直接使用Response对象内置的Selector对象即可:

>>> from scrapy.http import HtmlResponse
>>> body = '''
... <html>
...  <body>
...    <h1>Hello World</h1>
...    <h1>Hello Scrapy</h1>
...    <b>Hello python</b>
...    <ul>
...     <li>C++</li>
...     <li>Java</li>
...     <li>Python</li>
...    </ul>
...  </body>
... </html>
... '''
...
>>> response = HtmlResponse(url='http://www.example.com', body=body, encoding='utf8')
>>> response.selector
<Selector xpath=None data='<html>\n   <body>\n      <h1>He'>

为了方便用户使用,Response对象还提供了xpath和css方法,它们在内部分别调用内置Selector对象的xpath和css方法。Scrapy源码中的相关实现如下:

class TextResponse(Response):
 ...
 def xpath(self, query, **kwargs):
   return self.selector.xpath(query, **kwargs)

 def css(self, query):
   return self.selector.css(query)
 ...

使用这两个快捷方式可使代码更加简洁:

>>> response.xpath('.//h1/text()').extract()
['Hello World', 'Hello Scrapy']
>>> response.css('li::text').extract()
['C++', 'Java', 'Python']

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文