python 网页解析器掌握第三方 lxml 扩展库与 xpath 的使用方法

今天说的则是使用另外一种扩展库 lxml 来对网页完成解析。同样的,lxml 库能完成对 html、xml 格式的文件解析,并且能够用来解析大型的文档、解析速度也是相对比较快的。

要掌握 lxml 的使用,就需要掌握掌握 xpath 的使用方法,因为 lxml 扩展库就是基于 xpath 的,所以这一章的重点主要还是对 xpath 语法使用的说明。

1、导入 lxml 扩展库、并创建对象

# -*- coding: UTF-8 -*-

# 从 lxml 导入 etree
from lxml import etree

# 首先获取到网页下载器已经下载到的网页源代码
# 这里直接取官方的案例
html_doc = \"\"\"
<html><head><title>The Dormouse\'s story</title></head>
<body>
<p class=\"title\"><b>The Dormouse\'s story</b></p>

<p class=\"story\">Once upon a time there were three little sisters; and their names were
<a href=\"http://example.com/elsie\" rel=\"external nofollow\" class=\"sister\" id=\"link1\">Elsie</a>,
<a href=\"http://example.com/lacie\" rel=\"external nofollow\" class=\"sister\" id=\"link2\">Lacie</a> and
<a href=\"http://example.com/tillie\" rel=\"external nofollow\" class=\"sister\" id=\"link3\">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class=\"story\">...</p>
\"\"\"

# 初始化网页下载器的 html_doc 字符串,返回一个 lxml 的对象
html = etree.HTML(html_doc)

2、使用 xpath 语法提取网页元素

按照节点的方式获取元素

# xpath() 使用标签节点的方式获取元素
print html.xpath(\'/html/body/p\')
# [<Element p at 0x2ebc908>, <Element p at 0x2ebc8c8>, <Element p at 0x2eb9a48>]
print html.xpath(\'/html\')
# [<Element html at 0x34bc948>]
# 在当前节点的子孙节点中查找 a 节点
print html.xpath(\'//a\')
# 在当前节点的子节点中查找 html 节点
print html.xpath(\'/html\')

按照筛选的方式获取元素

\'\'\'
根据单一属性获取元素
\'\'\'
# 获取子孙节点中,属性 class=bro 的 a 标签
print html.xpath(\'//a[@class=\"bro\"]\')

# 获取子孙节点中,属性 id=link3 的 a 标签
print html.xpath(\'//a[@id=\"link3\"]\')

\'\'\'
根据多个属性获取元素
\'\'\'
# 获取class属性等于sister,并且id等于link3的a标签
print html.xpath(\'//a[contains(@class,\"sister\") and contains(@id,\"link1\")]\')

# 获取class属性等于bro,或者id等于link1的a标签
print html.xpath(\'//a[contains(@class,\"bro\") or contains(@id,\"link1\")]\')

# 使用 last() 函数,获取子孙代的a标签的最后一个a标签
print html.xpath(\'//a[last()]\')
# 使用 1 函数,获取子孙代的a标签的第一个a标签
print html.xpath(\'//a[1]\')
# 标签筛选,position()获取子孙代的a标签的前两个a标签
print html.xpath(\'//a[position() < 3]\')

\'\'\'
使用计算的方式,获取多个元素
\'\'\'
# 标签筛选,position()获取子孙代的a标签的第一个与第三个标签
# 可以使用的计算表达式:>、<、=、>=、<=、+、-、and、or
print html.xpath(\'//a[position() = 1 or position() = 3]\')

获取元素的属性与文本

\'\'\'
使用@获取属性值,使用text() 获取标签文本
\'\'\'
# 获取属性值
print html.xpath(\'//a[position() = 1]/@class\')
# [\'sister\']
# 获取标签的文本值
print html.xpath(\'//a[position() = 1]/text()\')
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容