python之解析HTML

时间:2025-02-11 21:46:05

原文链接/yoyoketang/p/
element和elementtree参考:/hellocsz/article/details/79780654
英文使用说明:/

lxml安装

使用pip安装lxml库

$ pip install lxml

pip show lxml查看版本号

$ pip show lxml

html解析

方法把html的文本内容解析成html对象,并对HTML文本进行自动修正。
打印html内容,可以用方法,encoding="utf-8"参数可以正常输出html里面的中文内容。pretty_print=True是以标准格式输出

# coding:utf-8

from lxml import etree

htmldemo = '''
<meta charset="UTF-8"> <!-- for HTML5 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<html><head><title>yoyo ketang</title></head>
<body>
<b><!--Hey, this in comment!--></b>
<p class="title"><b>yoyoketang</b></p>
<p class="yoyo">这里是我的微信公众号:yoyoketang
<a href="/yoyoketang/tag/fiddler/" class="sister" >fiddler教程</a>,
<a href="/yoyoketang/tag/python/" class="sister" >python笔记</a>,
<a href="/yoyoketang/tag/selenium/" class="sister" >selenium文档</a>;
快来关注吧!</p>
<p class="story">...</p>
'''

# 解析html内容
demo = (htmldemo)
# 打印解析内容str
t = (demo, encoding="utf-8", pretty_print=True)
print(("utf-8"))

运行结果

<html>
  <head><meta charset="UTF-8"/> <!-- for HTML5 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>yoyo ketang</title>
</head>
  <body>
<b><!--Hey, this in comment!--></b>
<p class="title"><b>yoyoketang</b></p>
<p class="yoyo">这里是我的微信公众号:yoyoketang
<a href="/yoyoketang/tag/fiddler/" class="sister" >fiddler教程</a>,
<a href="/yoyoketang/tag/python/" class="sister" >python笔记</a>,
<a href="/yoyoketang/tag/selenium/" class="sister" >selenium文档</a>;
快来关注吧!</p>
<p class="story">...</p>
</body>
</html>

解析 XML 字符串

网页下载下来以后是个字符串的形式,使用(str)构造一个 etree._ElementTree对象,使用 (t)返回一个字符串

>>> xml_string = '<root><foo  class="foo zoo">Foo</foo><bar>中文</bar><baz></baz></root>'
>>> root = (xml_string.encode('utf-8')) # 最好传 byte string
 
>>> (root)
#默认返回的是 byte string
b'<root>root content<foo  class="foo zoo">Foo</foo><bar>Bar</bar><baz/></root>'
 
>>> print((root, pretty_print=True).decode('utf-8'))
#decode 一下变成 unicode
<root>
  <foo  class="foo zoo">Foo</foo>
  <bar>Bar</bar>
  <baz/> # 注意这里没有子节点的 baz 节点被变成了自闭和的标签
</root>
 
>>> type(root)
<class '._Element'>

#可以看出 tostring 返回的是一个_Element类型的对象,也就是整个 xml 树的根节点

xpath使用案例

使用htnl解析器,最终是想获取html上的某些元素属性和text文本内容,接下来看下,用最少的代码,简单高效的找出想要的内容。
比如要获取“这里是我的微信公众号:yoyoketang”

# coding:utf-8

from lxml import etree

htmldemo = '''
复制上面的html内容
'''

# 解析html内容
demo = (htmldemo)

nodes = ('//p[@class="yoyo"]')
# 获取文本
t = nodes[0].text
print(t)

运行结果:

这里是我的微信公众号:yoyoketang

从代码量上看,简单的三行代码就能找到想要的内容了,比之前的beautifulsoup框架要简单高效的多

nodes是xpath定位获取到的一个list对象,会找出所有符合条件的元素对象。可以用for 循环查看详情

#coding:utf-8
from lxml import etree

htmldemo = '''
复制上面的html内容
'''

# 解析html内容
demo = (htmldemo)

nodes = ('//p[@class="yoyo"]')

print(nodes)  # list对象

for i in nodes:
    # 打印定位到的内容
    print((i, encoding="utf-8", pretty_print=True).decode("utf-8"))
    # 元素属性,字典格式
    print()

运行结果

[<Element p at 0x2bcd388>]
<p class="yoyo">这里是我的微信公众号:yoyoketang
<a href="/yoyoketang/tag/fiddler/" class="sister" >fiddler教程</a>,
<a href="/yoyoketang/tag/python/" class="sister" >python笔记</a>,
<a href="/yoyoketang/tag/selenium/" class="sister" >selenium文档</a>;
快来关注吧!</p>


{'class': 'yoyo'}

二次查找

通过xpath定位语法//p[@class=“yoyo”]定位到的是class="yoyo"这个元素以及它的所有子节点,如果想定位其中一个子节点,可以二次定位,继续xpath查找,如

nodes = ('//p[@class="yoyo"]')

t1 = nodes[0].xpath('//a[@]')
print(t1[0].text)

运行结果

python笔记