官术网_书友最值得收藏!

3.2 Response內置Selector

在實際開發中,幾乎不需要手動創建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']
主站蜘蛛池模板: 前郭尔| 五华县| 文安县| 惠东县| 桃园县| 台州市| 马关县| 银川市| 朝阳市| 滨海县| 大方县| 独山县| 康平县| 奉节县| 建德市| 渑池县| 汉源县| 玉林市| 泰来县| 会泽县| 红安县| 天气| 炎陵县| 镇原县| 福安市| 周至县| 乐都县| 囊谦县| 水城县| 灵川县| 香河县| 合肥市| 汉阴县| 阿图什市| 碌曲县| 平凉市| 徐汇区| 朝阳市| 明光市| 镇江市| 象山县|