xpath的使用

安装lxml库

pip --default-timeout=100 install lxml -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

requests和xpath的使用

from lxml import etree
import requests
headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
response = requests.get("http://www.baidu.com",headers=headers)
text = response.text
# 将文本标签树对象来使用xpath方法。
selector = etree.HTML(text)
# 获取所有div的内容
t = selector.xpath('//div//text()')
print(t)

xpath选择符号

# 基本符号和方法(未匹配到节点时返回空 [] )
// #可以跨层匹配(相对节点)
selector.xpath('//div//li')
/ #单层路径(绝对节点)
selector.xpath('//div/ul/li')
/text() #返回当前节点下的文本内容,内容中有标签会被标签分割为多个字段
selector.xpath('//ul[@id="useful"]/text()')
//text() #返回当前节点下及子节点的所有文本内容
selector.xpath('//ul[@id="useful"]//text()')
/@属性名 #返回当前节点对应属性的信息
link = selector.xpath('//a/@href')
//div | //p #返回两个符合两个规则的信息
selector.xpath('//a/text() | //p/text()')
. #表示当前节点
selector.xpath('./li')
.. #表示当前节点的父节点
selector.xpath('//a[text()="极客学院"]/../@id')
* #表示任意节点 和node()相同
selector.xpath('//div[@id="content"]/*/*/text()')
@* #表示含属性
selector.xpath('//li[@*]/text()')
.// #表示当前目录下的所有标签
selector.xpath('//ul')[0].xpath('.//text()')
//li[1] #返回每一区块匹配的第一个li,从1开始数。
selector.xpath('//li[1]//text()')
//div/@class #返回div的class属性的内容
selector.xpath('//div/@class')
//div[not(@class='c1')] #返回不包含class='c1'的div
selector.xpath('//div[not(@class="c1")]//text()')
//div[not(@class='c1' and @class='number') ] #返回不包含class='c1' 和 class='head'的div
selector.xpath('//div[not(@class="c1" and @class="number")]//text()')
//div[@calss='c1' or @calss='c2'] #返回@calss='c1' 或者 @calss='c2' 的div
selector.xpath('//div[@class="c1" or @class="c2"]//text()')
//div[last()] #返回最后一个div
selector.xpath('//div[last()]/text()')
//div[last()-1] #返回倒数第二个div
selector.xpath('//div[last()-1]/text()')
//div[price>"5"] #返回price属性值大于"5"的
selector.xpath('//div[@price>"5"]/@price')
//div[text()="50"] #返回div的内容为'50'的标签
selector.xpath('//div[text()="50"]/@class')
//ul[contains(@id,"num")] #div的ID包含字符'num'的标签
selector.xpath('//div[contains(@class,"num")]/@class')
//ul[starts-with(@id,"ur")] #div的ID开始字符'ur'的标签
selector.xpath('//div[starts-with(@id,"ur")]/@id')
//a/parent::div[@id="url"] #父节点 上一层的div
selector.xpath('//a/parent::div[@id="url"]//text()')
//b/ancestor::*/@id #祖先节点 上一层到多层
selector.xpath('//b/ancestor::*/@id')
//b/ancestor-or-self::*/@id #当前和上一层到多层
selector.xpath('//b/ancestor-or-self::*/@id')
count(//div[@id="url"]) #统计符号条件的标签个数
selector.xpath('count(//div[@id="url"])')
number(//div[@class="num"]/text()) #将第一个匹配的字符转换为float类型
selector.xpath('number(//div[@class="num"]/text())')
normalize-space(//a[@title="极客学院课程库"]//text()) #去除前后空格和回车
selector.xpath('normalize-space(//a[@title="极客学院课程库"]//text())')
sum(//div[@class="num"]/text()) #对匹配的字符求和
selector.xpath('sum(//div[@class="num"]/text())')

标签转换

from lxml import etree
html = ''
with open('./webPage.txt','r',encoding='utf-8') as f:
html = f.read()
selector = etree.HTML(html)
# 将标签对象还原回字符串
divhtml = etree.tostring(selector.xpath('//li')[0],pretty_print='True').decode('utf-8')
print(divhtml)
#提取节点包含的所有text
content = selector.xpath('//ul[@id="useful"]//text()')
#只取包含文字的信息
print([i for i in content if len(i.strip())>0 ])
posted @   会走的树  阅读(407)  评论(0编辑  收藏  举报
编辑推荐:
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
阅读排行:
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一次Java后端服务间歇性响应慢的问题排查记录
点击右上角即可分享
微信分享提示