文章目录
- 1、简介
 - 2、安装
 - 3、基本功能
 - 3.1 lxml.etree
 - 3.2 解析HTML网页
 - 3.3 读取并解析HTML文件
 - 3.4 提取所有a标签内的文本信息
 - 3.5 树迭代
 - 3.6 序列化
 - 3.7 元素以字典的形式携带属性
 - 3.8 元素包含文本
 
- 4、代码测试
 - 4.1 lxml解析网页
 - 4.2 使用xpath获取所有的文本
 - 4.3 使用xpath获取 class 为 "item-1" 的段落文本
 
- 结语
 
1、简介
https://lxml.de/
LXML是功能最丰富的 和易于使用的库 用于处理 XML 和 HTML 在 Python 语言中。
lxml XML 工具包是 C 库 libxml2 和 libxslt 的 Pythonic 绑定。它的独特之处在于它结合了速度和 这些库的 XML 功能完整性与 原生 Python API,大部分兼容,但优于众所周知的 ElementTree API。最新版本适用于所有 CPython 版本 从 2.7 增加到 3.9有关以下内容的更多信息,请参阅简介 LXML项目的背景和目标。
 
2、安装
https://github.com/lxml/lxml
 
下载源码:
git clone https://github.com/lxml/lxml.git lxml
 
或者安装库:
pip install lxml
#pip install lxml==3.4.2
 
3、基本功能
3.1 lxml.etree
import requests
from lxml import etree
 
res = requests.get("http://www.jsons.cn/zt/")
html = res.text
root_element = etree.HTML(html)
 
print(root_element)
print(root_element.tag)
 
3.2 解析HTML网页
#解析HTML字符串
from lxml import etree
text = '''
<html><body>
    <div class="key">
        <div class="name">无羡</div>
        <div class="age">20</div>
        <div class="address">四川</div>
    </div>
</body></html>
'''
# 开始初始化
html = etree.HTML(text)  # 这里需要传入一个html形式的字符串
print(html)
print(type)
# 将字符串序列化为html字符串
result = etree.tostring(html).decode('utf-8')
print(result)
print(type(result))
 
3.3 读取并解析HTML文件
from lxml import etree
 
# 将html文件进行读取
html = etree.parse('1.html')
 
# 将html内容序列化
result = etree.tostring(html).decode('utf-8')
print(result)
print(type(result))
html = etree.HTML(result)  # 这里需要传入一个html形式的字符串
print(html)
print(type)
 
3.4 提取所有a标签内的文本信息
from lxml import etree
# 创建解析对象
parse_html=etree.HTML(html)
# 书写xpath表达式,提取文本最终使用text()
xpath_bds='//a/text()'
# 提取文本数据,以列表形式输出
r_list=parse_html.xpath(xpath_bds)
# 打印数据列表
print(r_list)
 
3.5 树迭代
以递归方式遍历树,并用它的元素做一些事情。
>>> root = etree.Element("root")
>>> etree.SubElement(root, "child").text = "Child 1"
>>> etree.SubElement(root, "child").text = "Child 2"
>>> etree.SubElement(root, "another").text = "Child 3"
>>> print(etree.tostring(root, pretty_print=True))
<root>
  <child>Child 1</child>
  <child>Child 2</child>
  <another>Child 3</another>
</root>
>>> for element in root.iter():
...     print("%s - %s" % (element.tag, element.text))
root - None
child - Child 1
child - Child 2
another - Child 3
>>> for element in root.iter("child"):
...     print("%s - %s" % (element.tag, element.text))
child - Child 1
child - Child 2
>>> for element in root.iter("another", "child"):
...     print("%s - %s" % (element.tag, element.text))
child - Child 1
child - Child 2
another - Child 3
 
3.6 序列化
>>> root = etree.XML('<root><a><b/></a></root>')
>>> etree.tostring(root)
b'<root><a><b/></a></root>'
>>> print(etree.tostring(root, xml_declaration=True))
<?xml version='1.0' encoding='ASCII'?>
<root><a><b/></a></root>
>>> print(etree.tostring(root, encoding='iso-8859-1'))
<?xml version='1.0' encoding='iso-8859-1'?>
<root><a><b/></a></root>
>>> print(etree.tostring(root, pretty_print=True))
<root>
  <a>
    <b/>
  </a>
</root>
 
3.7 元素以字典的形式携带属性
>>> root = etree.Element("root", interesting="totally")
>>> etree.tostring(root)
b'<root interesting="totally"/>'
>>> print(root.get("interesting"))
totally
>>> print(root.get("hello"))
None
>>> root.set("hello", "Huhu")
>>> print(root.get("hello"))
Huhu
>>> etree.tostring(root)
b'<root interesting="totally" hello="Huhu"/>'
>>> sorted(root.keys())
['hello', 'interesting']
>>> for name, value in sorted(root.items()):
...     print('%s = %r' % (name, value))
hello = 'Huhu'
interesting = 'totally'
>>> attributes = root.attrib
>>> print(attributes["interesting"])
totally
>>> print(attributes.get("no-such-attribute"))
None
>>> attributes["hello"] = "Guten Tag"
>>> print(attributes["hello"])
Guten Tag
>>> print(root.get("hello"))
Guten Tag
>>> d = dict(root.attrib)
>>> sorted(d.items())
[('hello', 'Guten Tag'), ('interesting', 'totally')]
 
3.8 元素包含文本
>>> root = etree.Element("root")
>>> root.text = "TEXT"
>>> print(root.text)
TEXT
>>> etree.tostring(root)
b'<root>TEXT</root>'
 
4、代码测试
4.1 lxml解析网页
使用xpath获取所有段落的文本
# -*- coding: UTF-8 -*-
from lxml import etree
def fetch_text(html):
    html = etree.HTML(html)
    result = html.xpath("//p/text()")
    return result
    
if __name__ == '__main__':
    html = '''
        <html>
            <head>
                <title>这是一个简单的测试页面</title>
            </head>
            <body>
                <p class="item-0">body 元素的内容会显示在浏览器中。</p>
                <p class="item-1">title 元素的内容会显示在浏览器的标题栏中。</p>
            </body>
        </html>
        '''
    imgs = fetch_text(html)
    print(imgs)
 
4.2 使用xpath获取所有的文本
# -*- coding: UTF-8 -*-
from lxml import etree
def fetch_text(html):
    html = etree.HTML(html)
    result = html.xpath("//text()")
    return result
    
if __name__ == '__main__':
    html = '''
        <html>
            <head>
                <title>这是一个简单的测试页面</title>
            </head>
            <body>
                <p>body 元素的内容会显示在浏览器中。</p>
                <p>title 元素的内容会显示在浏览器的标题栏中。</p>
            </body>
        </html>
        '''
    imgs = fetch_text(html)
    print(imgs)
 
4.3 使用xpath获取 class 为 “item-1” 的段落文本
# -*- coding: UTF-8 -*-
from lxml import etree
def fetch_text(html):
    html = etree.HTML(html)
    result = html.xpath("//p[@class='item-1']/text()")
    return result
if __name__ == '__main__':
    html = '''
        <html>
            <head>
                <title>这是一个简单的测试页面</title>
            </head>
            <body>
                <p class="item-0">body 元素的内容会显示在浏览器中。</p>
                <p class="item-1">title 元素的内容会显示在浏览器的标题栏中。</p>
            </body>
        </html>
        '''
    imgs = fetch_text(html)
    print(imgs)
 
结语
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
 如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
 如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
 感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!



















