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://lxml.de/ 官方
 
 
posted @   sbsdnyn  阅读(569)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示