前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python:非结构化数据-lxml

Python:非结构化数据-lxml

原创
作者头像
HLee
修改2021-07-26 11:05:34
2.2K0
修改2021-07-26 11:05:34
举报
文章被收录于专栏:房东的猫房东的猫

简介

lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML ,支持 XPath (XML Path Language)。

lxml python 官方文档

代码语言:javascript
复制
pip3 install lxml==4.4.1

lxml语法

首先我们利用lxml来解析 HTML 代码,先来一个小例子来感受一下它的基本用法。使用 lxml 的 etree 库,然后利用 etree.HTML 初始化,然后我们将其打印出来。

代码语言:javascript
复制
from lxml import etree
text = '''
<div>
  <ul>
       <li class="item-0"><a href="link1.html">first item</a></li>
       <li class="item-1"><a href="link2.html">second item</a></li>
       <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
       <li class="item-1"><a href="link4.html">fourth item</a></li>
       <li class="item-0"><a href="link5.html">fifth item</a>
   </ul>
</div>
'''
#Parses an HTML document from a string
html = etree.HTML(text)   
#Serialize an element to an encoded string representation of its XML tree
result = etree.tostring(html)
print result

所以输出结果是这样的:

代码语言:javascript
复制
<html><body>
     <div>
       <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
       </ul>
     </div>
</body></html>

不仅补全了 li 标签,还添加了 body,html 标签。

  • 获取所有的<li>标签
代码语言:javascript
复制
print type(html)
result = html.xpath('//li')
print result
print len(result)
print type(result)
print type(result[0])

运行结果:
<type 'lxml.etree._ElementTree'>
[<Element li at 0x1014e0e18>, <Element li at 0x1014e0ef0>, <Element li at 0x1014e0f38>, <Element li at 0x1014e0f80>, <Element li at 0x1014e0fc8>]
5
<type 'list'>
<type 'lxml.etree._Element'>

可见,每个元素都是 Element 类型;是一个个的标签元素,类似现在的实例。

代码语言:javascript
复制
<Element li at 0x1014e0e18> Element类型代表的就是
<li class="item-0"><a href="link1.html">first item</a></li>

Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。每个element对象都具有以下属性:
  1. tag:string对象,标签,用于标识该元素表示哪种数据(即元素类型)。
  2. attrib:dictionary对象,表示附有的属性。
  3. text:string对象,表示element的内容。
  4. tail:string对象,表示element闭合之后的尾迹。

例如:
<tag attrib1=1>text</tag>tail
1     2        3         4

result[0].tag
result[0].text
result[0].tail
result[0].attrib
  • 获取<li>标签的所有 class
代码语言:javascript
复制
html.xpath('//li/@class')

运行结果:
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
  • 获取<li>标签下属性 href 为 link1.html 的<a>标签
代码语言:javascript
复制
html.xpath('//li/a[@href="link1.html"]')

运行结果:
[<Element a at 0x10ffaae18>]
  • 获取<li>标签下的所有<span>标签
代码语言:javascript
复制
注意这么写是不对的:html.xpath('//li/span')
因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠
html.xpath('//li//span')

运行结果:
[<Element span at 0x10d698e18>]
  • 获取<li>标签下的所有 class,不包括<li>的class
代码语言:javascript
复制
html.xpath('//li/a//@class')

运行结果:['blod']
  • 获取最后一个<li><a>的 href
代码语言:javascript
复制
html.xpath('//li[last()]/a/@href')

运行结果:['link5.html']
  • 获取 class 为 bold 的标签名
代码语言:javascript
复制
result = html.xpath('//*[@class="bold"]')
print result[0].tag

运行结果:span

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • lxml语法
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档