前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >lxml基本用法_XML是什么

lxml基本用法_XML是什么

作者头像
全栈程序员站长
发布于 2022-11-15 10:19:26
发布于 2022-11-15 10:19:26
73404
代码可运行
举报
运行总次数:4
代码可运行

lxml库结合libxml2快速强大的特性,使用xpath语法来进行文件格式解析,与Beautiful相比,效率更高。

0x01 安装

可以利用pip安装lxml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install lxml

Jetbrains全家桶1年46,售后保障稳定

在windows系统中安装时,可能会出现如下错误:

提示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27

需要安装Microsoft Visual C++ 9.0,对应的是visual studio 2008版本。其实我们可以用一种更简单的方式来解决这个问题。

(1)首先升级下pip:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m pip install -U pip

(2)安装wheel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install wheel

(3)下载lxml对应python版本的wheel文件:下载地址

其中cp27表示版本就是Python2.7,最后执行安装:

lxml安装完毕。

0x02 节点与属性

Element类是lxml的一个基础类,大部分XML都是通过Element存储的。可以通过Element方法创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> from lxml import etree
>>> root=etree.Element('root');
>>> print root.tag
root
  • 为root节点添加子节点:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> child1=etree.SubElement(root,'child1')
>>> print root
<Element root at 0x2246760>
>>> print etree.tostring(root)
<root><child1/></root>

XML Element的属性格式为Python的dict。可以通过get/set方法进行设置或获取操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> root.set('id','123')
>>> id=root.get('id')
>>> id
'123'

遍历全部属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> for value,name in root.items():
...     print value,'\t',name
...
id      123

0x03 文本操作

Element的text属性可以访问标签的文本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> print etree.tostring(root)
<root id="123">root<child1 name="kikay">ttt</child1></root>
>>> root.text
'root'
>>> child1.text
'ttt'
>>>

XML的标签是成对出现的,但是对于HTML而言,可能存在 这样的单一标签,可以通过tail来读取文本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> etree.tostring(root)
'<root id="123">root<child1 name="kikay">ttt</child1><br/>br_test</root>'
>>> root.tail
>>> br.tail
'br_test'

tail返回的是当前标签到下一次出现标签时的文本内容。

(2)xpath方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> etree.tostring(root)
'<root><child1>child1 test</child1><child2>child2 test</child2></root>123'
#方法1:过滤标签,返回全部文本
>>> root.xpath('string()')
'child1 testchild2 test'
#方法2:以标签为间隔,返回list
>>> root.xpath('//text()')
['child1 test', 'child2 test', '123']

方法2中的list元素都携带了标签的信息,可以通过如下方式获取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> lists=root.xpath('//text()')
>>> lists
['child1 test', 'child2 test', '123']
>>> lists[0].getparent()
<Element child1 at 0x2203c60>
>>> lists[0].getparent().tag
'child1'
>>> lists[1].getparent().tag
'child2'
>>> lists[2].getparent().tag
'root'

还可以通过is_text和is_tail判断标签类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> lists[2].is_text
False
>>> lists[2].is_tail
True

0x04 文本输入与输出

lxml提供如下方式输入文本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fromstring():解析字符串
HTML():解析HTML对象
XML():解析XML对象
parse():解析文件类型对象

输出就是前面讲的tostring()方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> root = etree.XML('<root><a><b/></a></root>')
>>> etree.tostring(root)
'<root><a><b/></a></root>'
>>> etree.tostring(root,xml_declaration=True)
"<?xml version='1.0' encoding='ASCII'?>\n<root><a><b/></a></root>"
>>> etree.tostring(root,xml_declaration=True,encoding='utf-8')
"<?xml version='1.0' encoding='utf-8'?>\n<root><a><b/></a></root>"

0x05 标签搜索

可以使用find、findall或者xpath来搜索Element包含的标签对象。区别如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
find():返回第一个匹配对象,并且xpath语法只能使用相对路径(以’.//’开头);
findall():返回一个标签对象的列表,并且xpath语法只能使用相对路径(以’.//’开头);
xpath():返回一个标签对象的列表,并且xpath语法的相对路径和绝对路径。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> root = etree.XML("<root><a x='123'>aText<b/><c/><b/></a></root>")
>>> x=root.find('.//a[@x]')
>>> x
<Element a at 0x2242c10>
>>> x.text
'aText'
>>> x.tag
'a'
>>> x2=root.findall('.//a[@x]')
>>> x2
[<Element a at 0x2242c10>]
>>> type(x2)
<type 'list'>
>>> x3=root.xpath('//a[@x]')
>>> type(x3)
<type 'list'>
>>> x3
[<Element a at 0x2242c10>]

此外,lxml还支持css语法的选择方式,对于熟悉JQuery选择器的开发者是一个很好的补充(需要安装pip install cssselect):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> root = etree.XML("<root><a class='_123'>aText<b id='b1'/><c/><b/></a></root>")
>>> a1=root.cssselect('._123')
>>> a1[0].tag
'a'
>>> root = etree.XML("<root><a class='c123'>aText<b id='b1'/><c/><b/></a></root>")
>>> a1=root.cssselect('a')
>>> a1[0].text
'aText'
>>> a2=root.cssselect('.c123')
>>> a2[0].text
'aText'
>>> b=root.cssselect('#b1')
>>> b[0].tag
'b'

0x06 解析HTML

lxml可以通过etree.HTML()来加载一个HTML页面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#coding:utf-8

from lxml import etree
import  requests
from chardet import detect

url='http://tool.chinaz.com/'
resp=requests.get(url,timeout=50)
html=resp.content
#识别编码
cder=detect(html)
html=html.decode(cder.get('encoding'))
tree=etree.HTML(html)
#打印全部a标签
hrefs=tree.xpath('//a')
for href in hrefs:
    print href.get('href'),'\t',href.text

使用lxml解析HTML页面时,一定要注意编码的问题,参考(Python学习笔记:Python字符编码问题的经验小结

如果HTML页面中的script和style变迁之间的内容影响解析页面,可以将其清洗掉:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from lxml.html.clean import Cleaner
clear=Cleaner(style=True,scripts=True,page_structure=False,safe_attrs_only=False)
print clear.clean_html(html)

此外,可以借助浏览器来帮我们生成xpath语法:

下面是提取豆瓣读书主页图书信息的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#coding:utf-8

from lxml import etree
import  requests
from chardet import detect

url='https://book.douban.com/'
resp=requests.get(url,timeout=15)
ecoding=detect(resp.content).get('encoding')
html=resp.content.decode(ecoding)
tree=etree.HTML(html)
for book in tree.xpath('//div[@class="info"]'):
    title=book.xpath('.//a[@title]')[0].text.strip()
    author=book.xpath('.//div[@class="author"]')[0].text.strip()
print u'《',title,u'》','\t','--',author

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
《 这世界偷偷爱着你 》    -- 辉姑娘
《 我与世界只差一个你 》   -- 张皓宸
《 好好学习 》    -- 成甲
《 生育对话录 》   -- 宋涵
《 被误诊的艺术史 》     -- 董悠悠
《 多拉•布吕代 》  -- [] 帕特里克•莫迪亚诺
《 我们的后人类未来 》    -- [] 弗朗西斯•福山

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/227301.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
不错
不错
回复回复点赞举报
推荐阅读
Linux curl命令最全详解
curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传…。
全栈程序员站长
2022/09/19
4.2K0
Linux curl命令最全详解
curl 命令常用场景
curl 命令向 www.qq.com 发出 GET 请求,服务器返回的内容会在命令行输出。
Yorkyu
2022/03/22
6010
curl 命令常用场景
curl命令使用
一、curl常用命令 这个命令我在linux下用的多一些,windows也可以,可以说是一款很强大的http命令行工具,支持上传、下载等操作,非常莱斯的工具。 1、get请求:并返回resp curl https://www.gaojs.com.cn # 测试请求是否可达:显示一次http通信的整个过程,包括端口连接和http request头信息 curl -v https://www.gaojs.com.cn 2、post请求 # post请求 curl -X -POST https://w
懿曲折扇情
2022/08/24
4.8K0
curl命令使用
windows下使用curl命令 && 常用curl命令
什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本。 如何在win
Java学习123
2018/05/16
5.1K0
Linux系列之学会使用CURL命令进行URL测试
curl命令是一个利用URL规则在shell终端命令行下工作的文件传输工具;curl命令作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征;做网页处理流程和数据检索自动化。
SmileNicky
2022/05/07
2.2K0
Linux系列之学会使用CURL命令进行URL测试
Linux curl 命令模拟 POST/GET 请求
curl 支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。
阳光岛主
2019/02/18
5.8K0
一文学会curl和curl详解
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。
星哥玩云
2022/05/28
5.1K0
一文学会curl和curl详解
web_bash笔记5
上例中不带www的地址会返回301,wget会自动追过去,下载index.html并保存到当前目录,默认文件名相同,已存在的话自动添后缀
ayqy贾杰
2019/06/12
1.3K0
curl的使用
curl是常用发起http请求工具,今天就整理下如何正确的使用curl命令,来提高工作效率。
付威
2020/01/21
1.6K0
CURL 那些不太为人知但强大的功能
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2025/03/29
440
CURL 那些不太为人知但强大的功能
curl命令调试接口「建议收藏」
大家好,很快就过年了,在这里先祝各位新年快乐,阖家欢乐!现在我们切入主题,在我们平时开发接口完成后,需要上线联调接口,而接口往往和业务逻辑精密联系,想要调试接口,就需要将业务测一遍,那么有没有更好的办法使得调试更简单?
全栈程序员站长
2022/08/01
2K0
curl 用法简介
curl 是一个命令行客户端,支持多种传输协议,最经常使用的场景就是在终端请求服务器资源。
后端码匠
2022/01/18
1.9K0
curl 用法简介
windows下使用curl命令
什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本。
共饮一杯无
2022/11/24
2.8K0
windows下使用curl命令
再议Linux中一些发行版中默认下载或上传工具curl的使用
版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢
耕耘实录
2018/12/20
1K0
curl命令
curl(CommandLine Uniform Resource Locator),是一个利用 URL 语法,在命令行终端下使用的网络请求工具,支持 HTTP、HTTPS、FTP 等协议。curl也有用于程序开发使用的版本 libcurl。
用户10638239
2024/01/16
3090
curl 命令详解
转载于: https://www.cnblogs.com/guixiaoming/p/8507268.html
全栈程序员站长
2022/09/07
5850
还在用 postman?手把手教你用 curl 提高工作效率
curl 是 Linux 系统上一款网络工具,它的首字母 c 代表的是 client,表示它是客户端程序。通过 URL 方式,可以实现客户端与服务器之间传递数据。
用户3105362
2021/11/12
1.3K0
linux之curl命令
原文链接:https://rumenz.com/rumenbiji/linux-curl.html
入门笔记
2021/10/20
3K0
Linux curl 命令详解
curl 是一个工具,用于传输来自服务器或者到服务器的数据。「向服务器传输数据或者获取来自服务器的数据」
踏歌行
2020/10/15
39.2K0
Linux curl 命令详解
Linux 命令(136)—— curl 命令
curl 命令是一个利用 URL 规则在 Shell 终端命令行下工作的文件传输工具;它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称 curl 为下载工具。
恋喵大鲤鱼
2020/03/09
3.7K0
相关推荐
Linux curl命令最全详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档