scrapy 2.3 CSS選擇器的擴展

2021-06-02 16:17 更新

根據(jù)W3C標準, CSS selectors 不支持選擇文本節(jié)點或?qū)傩灾?。但是在Web抓取上下文中選擇這些是非常重要的,以至于scrappy(parsel)實現(xiàn)了 non-standard pseudo-elements :

  • 要選擇文本節(jié)點,請使用 ?::text?
  • 要選擇屬性值,請使用 ?::attr(name)? 在哪里? name 是要為其值的屬性的名稱

警告

這些偽元素是特定于scrapy-/parsel的。他們很可能不會與其他類庫合作 lxml 或 PyQuery .

實例:

  • ?title::text? 選擇子代的子文本節(jié)點 ?<title>? 元素:
>>> response.css('title::text').get()
'Example website'
  • ?*::text? 選擇當前選擇器上下文的所有子代文本節(jié)點:
>>> response.css('#images *::text').getall()
['\n   ',
 'Name: My image 1 ',
 '\n   ',
 'Name: My image 2 ',
 '\n   ',
 'Name: My image 3 ',
 '\n   ',
 'Name: My image 4 ',
 '\n   ',
 'Name: My image 5 ',
 '\n  ']
  • ?foo::text? 如果 ?foo? 元素存在,但不包含文本(即文本為空):
>>> response.css('img::text').getall()
[]
這意味著 ?.css('foo::text').get()? 即使元素存在,也無法返回“無”。使用 ?default=''? 如果您總是想要字符串:
>>> response.css('img::text').get()
>>> response.css('img::text').get(default='')
''
  • ?a::attr(href)? 選擇 href 子鏈接的屬性值:
>>> response.css('a::attr(href)').getall()
['image1.html',
 'image2.html',
 'image3.html',
 'image4.html',
 'image5.html']

注解

參見: 選擇元素屬性 .

注解

不能鏈接這些偽元素。但在實踐中,這沒有多大意義:文本節(jié)點沒有屬性,屬性值已經(jīng)是字符串值,也沒有子節(jié)點。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號