《python3网络爬虫开发实战-崔庆才》阅读笔记:第四章解析库的使用(1)

1.使用XPath
常用规则:

表达式描述
nodename选取此节点的所有子节点
/从当前节点选取直接子节点
//从当前节点选取子孙节点
.选取当前节点
. .选取当前节点的父节点|
@获取属性
示例文档text:
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third itemL</a></li>
<li class="item-1"><a href="link4.html">forth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>

转换成可解析对象:

from lxml import etree
#初始化一个html对象,使其可以被xpath解析
#html = etree.HTML(text) 读取代码中声明的文本
html = etree.parse('./test.html',etree.HTMLParser())#解析文件
result = etree.tostring(html).decode('utf-8')#转换成str类型

搜索所有节点:

result = html.xpath('//*')
#result = html.xpath('//nodename') #获取所有的nodename节点

搜索子节点:

result = html.xpath('//li/a')
#result = html.xpath('//nodename/subnode') #获取子节点

搜索父节点:

result = html.xpath('//a[@href="link4.html"]/../@class')#获取属性为link4.html的a节点的父节点的class属性
#@获取属性
#result = html.xpath('//nodename/../') #获取父节点
#result = html.xpath('//nodename/parent::*')#获取父节点

获取文本:

result = html.xpath('//li/a[@href="link2.html"]/text()')
 =====output=======
['second item']
[Finished in 55ms]

获取属性:

result = html.xpath('//li/a/@href')
#//node/@attribute #获取属性
#//node[@attribute] #筛选属性,获取节点

属性多值匹配:

#li 的class属性有li 和 li-first 两个值,
text = '''
<li class="li li-first"><a href="link1.html">first item</a></li>
'''
html = etree.HTML(text)
#result = html.xpath('//li[@class="li"]/a/text()')#==》【】无法获取
result = html.xpath('//li[contains(@class,"li-first")]/a/text()')#==>['first item']
#contains(@contribute,"value1 value2..")匹配包含v1,v2属性的节点
#

多个属性匹配:

#li 的属性有class 和 name 两个,
text = '''
<li class="li li-first" name="item"><a href="link1.html">first item</a></li>
'''
html = etree.HTML(text)
#result = html.xpath('//li[@class="li"]/a/text()')#==》【】无法获取
result = html.xpath('//li[contains(@class,"li-first") and @name="item"]/a/text()')#==>['first item']
#多属性使用and连接
#

Xpath中 的运算符

and 、or、
mod(取余) 
| (//node1|node2  返回一个包含node12的集合)
+ - * div(8 div 4=2)
+  =  !=   <   >     <=     >=  

按序选择:

result = xpath('//li[1]/a/text()')#第一个
result = xpath('//li[last()]/a/text()')#最后一个
result = xpath('//li[position()<3]/a/text()')#第1,2个
result = xpath('//li[last-2]/a/text()')#倒数第三个

节点轴选择:

result = html.xpath('//li[1]//ancestor::*')#li[1]的所有祖先节点
result = html.xpath('//li[1]//ancestor::div')#li[1]的div祖先节点
result = html.xpath('//li[1]//attribute::*')#li[1]的所有属性
result = html.xpath('//li[1]//child::a[@href="link1.html"]')#li[1]的子节点中属性为link1.html的a节点
descendant:所有子孙节点
following:后续节点
following-sibling:后续节点中与当前节点同级的节点
...

了解更多:

XPath更多用法


Python lxml库用法

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值