本文转载自知乎专栏《lxml.etree:用Xpath获取静态文本》
一、简介
lxml 是一个结合了 libxml2快速强大的特效和 Python 语言的易用性的一个第三方库,parse html 具有比 BeautifulSoup 更高的性能。
from lxml import etree # 调用方法
二、基础
Element是 lxml 中的一个类,大部分XML都是通过这个类创建与存储的。
root = etree.Element("root")
print(root.tag) #调用root的tag属性
>>> root
child1 = etree.SubElement(root, "child1") #为根节点添加子节点
列表List
为了方便获取子节点,这些子节点都是以列表的方式储存的。
child = root[0]
print(child.tag)
>>> child1
# child{柴鸥的}=子孙
字典Dict
XML Element 的属性格式为 Python 中的字典格式,你可以通过以下方式添加或获取:
root = etree.Element("root", interesting="totally")
print(root.get("interesting"))
>>> totally
# interesting{因踹死钉} = 引起兴趣的
# element{艾乐蒙特} = 元素
# tag{泰格} = 标签
三、解析文本
lxml.etree中提供了几种方法用于解析文本:
etree.fromstring() # 用于解析字符串
etree.HTML() # 用于解析HTML对象
etree.XML() # 用于解析XML对象
etree.parse() # 用于解析文件类型的对象,parse{帕斯]=解析
四、用 Xpath 获取静态文本
Xpath为XML路径语言,用来确定XML文档中某个位置,类似于地理中经纬网的作用。
五、实例爬取东方财富网数据
用 Xpath 获取静态文本:
import requests
from lxml import etree
# 用Requests库抓取整个页面
url = 'http://data.eastmoney.com/cjsj/cpi.html'
content = requests.get(url).content
# 用etree.HTML()解析对象
html = etree.HTML(content)
# 右键copy.Xpath复制后,通过etree.xpath()函数调用
html.xpath('//*[@id="tb"]/tr[3]/td[2]/text()')
# 部分浏览器会在table标签下添加tbody标签,因此将Xpath中的tbody删去,否则将无法获取数据。
六、ElementPath
lxml 中支持一种类似于Xpath的路径语言,叫ElementPath。里面提供了四种方法获取元素和文档树:
iterfind() # 迭代所有符合条件的元素
findall() # 以列表形式返回所有元素
find() # 返回第一个元素
findtext() # 返回第一个元素的 text
ElementPath中不能使用绝对路径,因此不能直接使用从浏览器复制的Xpath,需要在前面加个“.”号。