etree的一些用法
一、常用:
节点:
1、/,表示只在当前路径。如//table/tr,表示所有table下的tr节点(直接子节点)。
2、//,表示全部此节点路径。如//table,表示所有table下的节点(所有子孙节点,遍历)。
3、.,表示当前节点。如./tr,表示当前节点下的tr。
4、..,表示当前节点的父节点。如../tr,表示当前节点父节点下的tr。
选择:
1、/text(),表示取出当前节点下的文本。如//table/tr/td[1]/text(),表示所有table下的tr下的td中的第1个的文本,如果不加,取的就是节点对象。
2、/@xxx,表示取当前节点下xxx属性的属性值。如//a/img/@alt,表示取所有a下的img节点里的alt属性。
3、/zzz[@xxx="yyy"],表示取zzz节点下的属性为xxx的属性值为yyy的节点。如//table[@class="players_table"],表示所有table中取class属性中值为players_table的的table。
4、/zzz[contains(@xxx,'yyy')],表示取zzz节点下的包含属性为xxx的属性值为yyy的节点。如//td[contains(@class,'chartBall02')],表示所有td下取包含class属性中值为chartBall02的td(包括只有chartBall02)。
5、/zzz[not(contains(@xxx,'yyy'))],表示与上面的意思相反。如//tr[not(contains(@class,'tdbck'))],表示所有tr下,排除class属性中值为tdbck的tr。
6、/zzz[a|b],|表示取合集,即zzz下的a和b的合集。如//div[a|ul],选择所有div下所有a和ul。也可以 /zzz[a] | /www[b] 这样写。
7、/zzz[starts-with(@xxx, ‘yyy’)],表示zzz下取以,xxx属性中值为yyy,开头的zzz。如//div[starts-with(@id, ’text')],表示提取所有div下属性为id的值为text,开头的div。
8、td[1]、td[last()]、td[position()>2 and position()<4]、td[last()-1],表示在取td节点中的第1个、最后一个、第3个、倒数第2个。如//table/tr/td[1],表示所有table下的tr下的td中的第1个。
二、子xpath:
/text() 如果是空,xpath会抛弃这个元素,那返回的list就会少元素,需要处理。
思路:先取对象,然后遍历对象,取出text,join连起来。但这只适合一个文本或者无文本,如果遇到多个文本的(如带br的会取出2个元素),则需要进一步具体问题具体分析。
e = etree.HTML(resp.text)
all = [] for tr in e.xpath('//table/tr'): tr_lis = tr.xpath('./text()') tr_s = ''.join(tr_lis) all.append(tr_s) return all
all = [''.join(tr.xpath('./text()')) for tr in e.xpath('//table/tr')] #或者写成一行。
三、如果只有路径,返回的是对象,可用:
1、etree.tostring(lis[i], encoding='utf-8').decode('utf-8'),来获取全部路径内容,如果没有汉字,可不用encoding和decode来编码解码,然后再进一步处理。
2、e.xpath('//table/tr')[0].xpath('string(.)'),这个挺好用,在整个循环里写就是:
[i.xpath('string(.)').strip() for i in e.xpath('//li[not(contains(@style,"display: none;"))]//div[@class="nhouse_price"]')]
string还可以处理这种情况:td/text() | td/a/text() ,有的文本在td下,有的文本在td的a下,那么可以直接在td下string就都可以得到了。如https://nba.hupu.com/stats/players里面的球员和球队。
四、运算符:来自 https://www.w3cschool.cn/lxml/_lxml-8jft3fk1.html
运算符 | 描述 | 实例 | 返回值 |
or | 或 | age=10 or age=20 | 如果age等于10或者等于20则返回true反正返回false |
and | 与 | age>19 and age<21 | 如果age等于20则返回true,否则返回false |
mod | 取余 | 5 mod 2 | 1 |
| | 取两个节点的集合 | //book | //cd | 返回所有拥有book和cd元素的节点集合 |
+ | 加 | 5+4 | 9 |
- | 减 | 5-4 | 1 |
* | 乘 | 5*4 | 20 |
div | 除法 | 6 div 3 | 2 |
= | 等于 | age=10 | true |
!= | 不等于 | age!=10 | true |
< | 小于 | age<10 | true |
<= | 小于或等于 | age<=10 | true |
> | 大于 | age>10 | true |
>= | 大于或等于 | age>=10 | true |
使用方法如:来自 https://www.w3cschool.cn/lxml/_lxml-98h23fk0.html
result=html.xpath('//li[@class="aaa" and @name="fore"]/a/text()')
result1=html.xpath('//li[contains(@class,"aaa") and @name="fore"]/a/text()')
五、参考网站未整理:
https://www.jianshu.com/p/4d3c9cae5470
https://blog.csdn.net/qq_23120963/article/details/129993462
https://zhuanlan.zhihu.com/p/394134264
http://www.360doc.com/content/23/0210/11/81615618_1066999473.shtml
https://blog.csdn.net/q1246192888/article/details/123649072
https://blog.csdn.net/weixin_59246157/article/details/130000926
https://blog.csdn.net/free_xiaochen/article/details/128183052
https://blog.csdn.net/qq_23120963/article/details/129993462
https://zhuanlan.zhihu.com/p/394134264
http://www.360doc.com/content/23/0210/11/81615618_1066999473.shtml
https://blog.csdn.net/q1246192888/article/details/123649072
https://blog.csdn.net/weixin_59246157/article/details/130000926
https://blog.csdn.net/free_xiaochen/article/details/128183052
https://lxml.de/ 官方
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY