理解 lxml 以及 xpath
什么是 lxml?
python 中用来处理 XML 和 html 的 library 与其他相比, 它能提供很好的性能, 并且它支持 XPath 具体可以查看官方文档 ->http://lxml.de/index.html
结构化数据:
XML, JSON
非结构化数据:
HTML 文本是最常见的数据格式, 因为一般我们需要的关键信息并非直接可以得到, 需要进行对 HTML 的解析查找, 甚至一些字符串操作才能得到, 所以归类于非结构化的数据处理中
python lxml 库可以使用 elements 来创建 XML/HTML 结构, 也可以从 XML/HTML 结构中解析出想要的信息
创建 HTML 结构
1. 导包, etree 用来创建元素和结构
from lxml import etree
2. 使用 Element class API 来创建多个元素元素也被称作结点
root = etree.Element(html)
3.XML/HTML 结构遵循父亲 - 儿子范例, 一个结点可以是其他结点的父亲或者儿子在 lxml 中要创建这种关系可以使用 etree 模块下的 SubElement
- In [5]: etree.SubElement(root, head)
- Out[5]: <Element head at 0x7f43a5c51e60>
- In [6]: etree.SubElement(root, body)
- Out[6]: <Element body at 0x7f43a5c51f38>
- In [7]: print etree.tostring(root)
- <html><head/><body/></html>
4 每个结点有很多属性
解析 HTML 结构
1 使用 lxml 的 etree 库, 然后利用 etree.HTML 解析
- In [19]: import requests
- In [20]: from lxml import etree
- In [21]: page = requests.get(http://www.cnn.com)
- In [22]: html_content = etree.html(page.text)
当我们获得一个 etree 结构时, 接下来需要用到 XPath 去定位信息 它有特定的表达式去选择结点或者一组特定结点
XPath
XPath(XML Path Language) 是 XML 路径语言, 它是一种用来定位 XML 文档中某部分位置的语言
表达式 | 描述 |
---|---|
/ | 从根节点选取。 |
nodename | 选取此节点的所有子节点。 |
// | 从当前节点 选择 & nbsp; 所有匹配文档中的节点 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
每个结点类型是一种灵活的容器对象, 用于在内存中存储结构化数据
每个结点对象都具有以下属性:
1. tag:string 对象, 标签, 用于标识该元素表示哪种数据 (即元素类型)
2. attrib:dictionary 对象, 表示附有的属性
3. text:string 对象, 表示 element 的内容
4. tail:string 对象, 表示 element 闭合之后的尾迹
- <tag attrib1=1>text</tag>tail
- 1 2 3 4
谓语条件 (Predicates)
谓语用来查找某个特定的信息或者包含某个指定的值的节点
所谓 "谓语条件", 就是对路径表达式的附加条件
谓语是被嵌在方括号中, 都写在方括号 "[]" 中, 表示对节点进行进一步的筛选
来源: http://www.bubuko.com/infodetail-2509787.html