Lxml库的使用

1.Lxml的作用

Lxml为XML解析库,但是也很好的支持了HTML文档的解析功能,这使得Lxml库爬取网络信息提供了支持条件.

小拓展:XML(Extensible Markup Language)是一种标记语言,用于存储和传输数据.它由W3C(万维网联盟)进行标准化,目的在于提供一种简单又灵活的文本格式来创建子描述性的数据结构.XML设计的初衷是传输数据,而非显示数据.XML的主要特点:可扩展性,自我描述性,文本格式,支持Unicode,与平台和语言无关,支持复杂的数据结构和验证能力.2

2.Lxml实用的的功能(修正HTML代码)

前面提到过,Lxml也支持HTML文档的解析功能.这样就可以通过Lxml库来解析HTML文档了,

例如:

HTML()函数:是python中lxml库的一个函数,用于解析HTML文档并生成一个Element对象,这个对象可以使用Xpath表达式进行查询.其主要用途是解析HTML字符串或者文件,返回一个Element对象,这个对象包含了HTML文档的所有元素,并且以树状结构组织.

tostring()函数:是python的lxml库中的一个函数,用于将Element对象转化为字符串.这个函数在需要将解析后的XML或HTML文档输出为字符串时非常有用.

from lxml import etree
text = '''
<div>
    <ul>
        <li class="red"><h1>red flowers</h1</li>
        <li class="yellow"><h2>yellow flowers item</h2></li>
        <li class="white"><h3>white flowers</h3></li>
        <li class="black"><h4>black flowers</h4></li>
        <li class="blue"><h5>blue flowers</h5></li>
    </ul>
</div>
'''

html = etree.HTML(text)
result = etree.tostring(html)
print(result)

输出:

b'<html><body><div>\n    <ul>\n        <li class="red"><h1>red flowers</h1>\n        </li><li class="yellow"><h2>yellow flowers item</h2></li>\n        <li class="white"><h3>white flowers</h3></li>\n        <li class="black"><h4>black flowers</h4></li>\n        <li class="blue"><h5>blue flowers</h5></li>\n    </ul>\n</div>\n</body></html>

从这个例子可以看出,Lxml库中自动修正HTML代码是一个非常实用的功能.

3.读取HTML文件

在同样的目录下创建html文件,,取名为flower.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
<div>
    <ul>
        <li class="red"><h1>red flowers</h1></li>
        <li class="yellow"><h2>yellow flowers item</h2></li>
        <li class="white"><h3>white flowers</h3></li>
        <li class="black"><h4>black flowers</h4></li>
        <li class="blue"><h5>blue flowers</h5></li>
    </ul>
</div>
</body>
</html>

创建python文件:

parse()函数:使用lxml库的etree模块解析HTML文件的函数.这个命令会返回一个ElementTree对象,这个对象代表了HTML文档的树形结构.

注意:虽然etree.parse()可以用来解析HTML文件但是由于HTML的语法通常比XML更为宽松,直接使用etree.parse()解析HTML文件可能会遇到一些问题.例如:HTML中有一些元素可以没有关闭标签的如:<br>,而在XML中所有的元素都必须有关闭标签.因此,当解析HTML文件时,更推荐使用etree.HTML()函数或者创建一个etree.HTMLParser()对象作为解析器.

pretty_print=True是etree.tostring()函数的一个参数,当设置为True时,它会让输出XML或HTML字符串以更美观易读的格式展示,也即是说,会添加适当的换行和缩进k

from lxml import etree

html = etree.parse('flower.html')
result = etree.tostring(html,pretty_print=True)
print(result)

看到输出后我们发现并没有想象中的缩进和换行

原因:

etree.tostring(html,pretty_print=True)的作用是将html这个ElementTree对象转化为一个格式化的字符串,而pretty_print=True参数应该会让输出的HTML字符串一更美观,易读的格式展示,包括适当的换行和缩进.

而导致输出的字符串没有进行预期的格式化可能是:

etree.tostring()返回的试试字节串(bytes),而不是str字符串.在python中,打印字节串会包括b'......'

前缀,并且所有的特殊字符(包括换行和制表符)都会被转义,为了正确的打印格式化的字符串,你需要将字节串解码为字符串,例如:print(result.decode('utf-8)).

所已修正后的代码:

from lxml import etree

html = etree.parse('flower.html')
result = etree.tostring(html,pretty_print=True)
print(result.decode('utf-8'))

输出:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
<div>
    <ul>
        <li class="red"><h1>red flowers</h1></li>
        <li class="yellow"><h2>yellow flowers item</h2></li>
        <li class="white"><h3>white flowers</h3></li>
        <li class="black"><h4>black flowers</h4></li>
        <li class="blue"><h5>blue flowers</h5></li>
    </ul>
</div>
</body>
</html>

4.利用前面所学来解析HTML文件

解析https://book.douban.com/top250

from lxml import etree
import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'}
res = requests.get('https://book.douban.com/top250',headers=headers)
content = etree.HTML(res.text)
html = etree.tostring(content,pretty_print=True)
print(html.decode())

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值