博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python笔记27-lxml.etree解析html
阅读量:468 次
发布时间:2019-03-06

本文共 2047 字,大约阅读时间需要 6 分钟。

前言

之前分享过一个python爬虫beautifulsoup框架可以解析html页面,最近看到lxml框架的语法更简洁,学过xpath定位的,可以立马上手。

使用环境:
python 3.6
lxml 4.2.4

lxml安装

使用pip安装lxml库

$ pip install lxml

pip show lxml查看版本号

$ pip show lxml

html解析

这里用到etree.HTML方法把html的文本内容解析成html对象

要打印html内容,可以用etree.tostring方法,encoding="utf-8"参数可以正常输出html里面的中文内容。pretty_print=True是以标准格式输出

# coding:utf-8from lxml import etreehtmldemo = '''
yoyo ketang

yoyoketang

这里是我的微信公众号:yoyoketangfiddler教程,python笔记,selenium文档;快来关注吧!

...

'''# etree.HTML解析html内容demo = etree.HTML(htmldemo)# 打印解析内容strt = etree.tostring(demo, encoding="utf-8", pretty_print=True)print(t.decode("utf-8"))

运行结果

  
yoyo ketang

yoyoketang

这里是我的微信公众号:yoyoketangfiddler教程,python笔记,selenium文档;快来关注吧!

...

soupparser解析器

soupparser解析器比上面的etree.HTML容错性要好一点,因为其处理不规范的html的能力比etree强太多。

import lxml.html.soupparser as soupparserdemo = soupparser.fromstring(htmldemo)t = etree.tostring(demo, encoding="utf-8", pretty_print=True)print(t.decode("utf-8"))

xpath使用案例

使用htnl解析器,最终是想获取html上的某些元素属性和text文本内容,接下来看下,用最少的代码,简单高效的找出想要的内容。

比如要获取“这里是我的微信公众号:yoyoketang”

# coding:utf-8from lxml import etreehtmldemo = '''复制上面的html内容'''# etree.HTML解析html内容demo = etree.HTML(htmldemo)nodes = demo.xpath('//p[@class="yoyo"]')# 获取文本t = nodes[0].textprint(t)

运行结果:

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

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

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

# coding:utf-8from lxml import etreehtmldemo = '''复制上面的html内容'''# etree.HTML解析html内容demo = etree.HTML(htmldemo)nodes = demo.xpath('//p[@class="yoyo"]')print(nodes)  # list对象for i in nodes:    # 打印定位到的内容    print(etree.tostring(i, encoding="utf-8", pretty_print=True).decode("utf-8"))    # 元素属性,字典格式    print(i.attrib)

运行结果

[
]

这里是我的微信公众号:yoyoketangfiddler教程,python笔记,selenium文档;快来关注吧!

{'class': 'yoyo'}

二次查找

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

nodes = demo.xpath('//p[@class="yoyo"]')t1 = nodes[0].xpath('//a[@id="link2"]')print(t1[0].text)

运行结果

python笔记

作者:上海-悠悠 python自动化交流 QQ群:779429633

你可能感兴趣的文章