Python scrapy中xpath的定位及筛选节点的写法大全
scrapy中xpath的定位写法汇总
寻找父元素:://DDD/parent::* DDD节点的所有父节点
寻找祖先节点:ancestor::BOOK[1] 离当前上下文节点最近的book祖先节点
寻找孩子节点:/child::AAA 等价于/AAA
寻找兄弟节点:following-sibling::div[@class='pct']
示例:
current.xpath("ancestor::div[@class='pi']").xpath("following-sibling::div[@class='pct']").xpath("descendant::td[@class='t_f']/text()").extract()
其含义是寻找当前节点current的祖先节点div[@class='pi'的兄弟节点div[@class='pct的后代节点:td[@class='t_f']/的文本内容
python scrapy中xpath的筛选方法
1. //NODE[not(@class)] 所有节点名为node,且不包含class属性的节点
2. //NODE[@class and @id] 所有节点名为node,且同时包含class属性和id属性的节点
3. //NODE[contains(text(),substring] 所有节点名为node,且其文本中包含substring的节点//A[contains(text(),\"下一页\")] 所有包含“下一页”字符串的超链接节点
4.//A[contains(@title,"文章标题")] 所有其title属性中包含“文章标题”字符串的超链接节点4. //NODE[@id="myid"]/text() 节点名为node,且属性id为myid的节点的所有直接text子节点
5. BOOK[author/degree] 所有包含author节点同时该author节点至少含有一个的degree孩子节点的book节点6. AUTHOR[.="Matthew Bob"] 所有值为“Matthew Bob”的author节点
7. //*[count(BBB)=2] 所有包含两个BBB孩子节点的节点
8. //*[count(*)=2] 所有包含两个孩子节点的节点
9. //*[name()='BBB'] 所有名字为BBB的节点,等同于//BBB
10. //*[starts-with(name(),'B')] 所有名字开头为字母B的节点
11. //*[contains(name(),'C')] 所有名字中包含字母C的节点
12. //*[string-length(name()) = 3] 名字长度为3个字母的节点
13. //CCC | //BBB 所有CCC节点或BBB节点
14. /child::AAA 等价于/AAA
15. //CCC/descendant::* 所有以CCC为其祖先的节点
16. //DDD/parent::* DDD节点的所有父节点
17. //BBB[position() mod 2 = 0] 偶数位置的BBB节点
18. AUTHOR[not(last-name = "Bob")] 所有不包含元素last-name的值为Bob的节点
19. P/text()[2] 当前上下文节点中的P节点的第二个文本节点
20. ancestor::BOOK[1] 离当前上下文节点最近的book祖先节点
21. //A[text()="next"] 锚文本内容等于next的A节点
python scrapy 中 css选择器的使用方法
响应对象公开 Selector 实例对 .selector 属性:
>>> response.selector.xpath('//span/text()').get()
'good'
使用xpath和css查询响应非常常见,因此响应中还包含两个快捷方式:
response.xpath()
和 response.css()
:
>>> response.xpath('//span/text()').get()
'good'
>>> response.css('span::text').get()
'good'
Scrapy选择器是 Selector 通过传递 TextResponse 对象或标记作为字符串(在 text 争论)。
通常不需要手动构造垃圾选择器: response 对象在spider回调中可用,因此在大多数情况下使用它更方便 response.css() 和 response.xpath() 捷径。通过使用 response.selector 或者这些快捷方式之一,您还可以确保响应主体只解析一次。
但如果需要,可以使用 Selector 直接。从文本构建:
>>> from scrapy.selector import Selector
>>> body = '<html><body><span>good</span></body></html>'
>>> Selector(text=body).xpath('//span/text()').get()
'good'
从响应构造- HtmlResponse 是其中之一 TextResponse 子类:
>>> from scrapy.selector import Selector
>>> from scrapy.http import HtmlResponse
>>> response = HtmlResponse(url='http://example.com', body=body)
>>> Selector(response=response).xpath('//span/text()').get()
'good'
使用案例
案例HTML代码
<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
<a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
<a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
<a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
<a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
</div>
</body>
</html>
选择器示例
构造一个XPath来选择title标记内的文本:
response.xpath('//title/text()')
要实际提取文本数据,必须调用选择器 .get() 或 .getall() 方法如下:
response.xpath('//title/text()').getall()
response.xpath('//title/text()').get()
.get() 始终返回单个结果;如果有多个匹配项,则返回第一个匹配项的内容;如果没有匹配项,则不返回任何匹配项。 (或其别名) .extract_first() 常用于旧版本)
.getall() 返回包含所有结果的列表。
请注意,CSS选择器可以使用CSS3伪元素选择文本或属性节点:
response.css('title::text').get()
正如你所看到的, .xpath() 和 .css() 方法返回 SelectorList 实例,它是新选择器的列表。此API可用于快速选择嵌套数据:
response.css('img').xpath('@src').getall()
结果:
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
它返回 None 如果找不到元素:
response.xpath('//div[@id="not-exists"]/text()').get() is None
True
可以将默认返回值作为参数提供,以代替 None :
response.xpath('//div[@id="not-exists"]/text()').get(default='not-found')
例如 '@src' xpath可以使用 .attrib A的性质 Selector :
[img.attrib['src'] for img in response.css('img')]
作为捷径, .attrib 也可以直接在SelectorList上使用;它返回第一个匹配元素的属性:
response.css('img').attrib['src']
当只需要一个结果时(例如,按id选择,或在网页上选择唯一元素时),此选项最有用:
response.css('base').attrib['href']
现在我们将获得基本URL和一些图像链接:
response.xpath('//base/@href').get()
response.css('base::attr(href)').get()
response.css('base').attrib['href']
response.xpath('//a[contains(@href, "image")]/@href').getall()
response.css('a[href*=image]::attr(href)').getall()
response.xpath('//a[contains(@href, "image")]/img/@src').getall()
response.css('a[href*=image] img::attr(src)').getall()
scrapy CSS选择器的扩展
要选择文本节点,请使用 ::text
要选择属性值,请使用 ::attr(name) 在哪里? name 是要为其值的属性的名称
警告:这些伪元素是特定于scrapy-/parsel的。他们很可能不会与其他类库合作 lxml 或 PyQuery .
实例
title::text 选择子代的子文本节点 <title> 元素
response.css('title::text').get()
*::text 选择当前选择器上下文的所有子代文本节点:
response.css('#images *::text').getall()
foo::text 如果 foo 元素存在,但不包含文本(即文本为空):
response.css('img::text').getall()
a::attr(href) 选择 href 子链接的属性值:
response.css('a::attr(href)').getall()
python scrapy selector 嵌套选择器
选择方法 (.xpath() 或 .css() )返回同一类型选择器的列表,以便您也可以调用这些选择器的选择方法。下面是一个例子
links = response.xpath('//a[contains(@href, "image")]')
links.getall()
for index, link in enumerate(links):
href_xpath = link.xpath('@href').get()
img_xpath = link.xpath('img/@src').get()
print(f'Link number {index} points to url {href_xpath!r} and image {img_xpath!r}')
python scrapy selector 选择元素属性
有几种方法可以获得属性的值。首先,可以使用XPath语法:
response.xpath("//a/@href").getall()
xpath语法有几个优点:它是标准的xpath特性,并且 @attributes 可用于xpath表达式的其他部分-例如,可以按属性值筛选。
scrapy还提供了对css选择器的扩展 (::attr(...) )它允许获取属性值:
response.css('a::attr(href)').getall()
除此之外,还有 .attrib 选择器的属性。如果您喜欢在Python代码中查找属性,而不使用xpath或CSS扩展,则可以使用它:
[a.attrib['href'] for a in response.css('a')]
结果如下 :
['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
此属性在SelectorList上也可用;它返回一个字典,其中包含第一个匹配元素的属性。当选择器预期给出单个结果时(例如,当按元素ID选择时,或在页面上选择唯一元素时),使用它非常方便:
response.css('base').attrib
结果:
{'href': 'http://example.com/'}
.attrib 空SelectorList的属性为空:
response.css('foo').attrib
python scrapy 将选择器与正则表达式一起用
Selector
也有 .re()
使用正则表达式提取数据的方法。但是,与使用不同 .xpath()
或 .css()
方法, .re()
返回字符串列表。所以你不能构造嵌套的 .re()
电话。
下面是一个用于从 HTML code 以上
response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
另外还有一个助手在做往复运动 .get() (及其别名) .extract_first() 为 .re() 命名 .re_first() . 使用它只提取第一个匹配字符串:
response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')
python scrapy HTML响应的选择器示例
这里有一些 Selector 举例说明几个概念。在所有情况下,我们假设 Selector 用一个 HtmlResponse 这样的对象:
sel = Selector(html_response)
选择全部 <h1> 来自HTML响应正文的元素,返回 Selector 对象(即 SelectorList 对象):
sel.xpath("//h1")
提取所有文本 <h1> 元素,返回字符串列表:
sel.xpath("//h1").getall() # this includes the h1 tag
sel.xpath("//h1/text()").getall() # this excludes the h1 tag
全部迭代 <p> 标记并打印其类属性:
for node in sel.xpath("//p"):
print(node.attrib['class'])
参考链接: