html提取信息变xml,网络爬虫笔记【7】 利用 XPATH 实现 XML 和 HTML 文本信息提取

XML(Extensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据。

HTML指的是超文本标记语言 (Hyper Text Markup Language),是WWW上用于编写网页的主要工具,详细信息请参考 http://www.w3school.com.cn/html

XML和HTML都是一种标记语言 (markup language),使用标记标签来描述数据,这些标签可用于查找和定位数据。

下面是 xml 文档的一个例子:Harry Potter29.99Learning XML39.95

父(Parent)每个元素以及属性都有一个父,上例中book 元素是 title、price 元素的父结点;

子(Children)元素节点可有零个、一个或多个子,上例中 title、price 元素都是 book 元素的子结点;

同胞(Sibling)拥有相同的父的节点,上例中title、price 为同胞结点;

先辈(Ancestor)某节点的父、父的父等等,上例中title、price 的先辈结点是bookstore。

后代(Descendant)某个节点的子,子的子,上例中bookstore的后代结点为 book、title、price。

XPath 语法

XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。细节可以参考W3School官方文档:http://www.w3school.com.cn/xpath/index.asp

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

XPath 开发工具有:开源的XPath表达式编辑工具:XMLQuire(XML格式文件可用)

Chrome插件 XPath Helper

Firefox插件 XPath Checker# XPath 常用路径表达式学习

'''Harry Potter29.99Learning XML39.95'''

# 下面列出了最常用的路径表达式

'bookstore'   # 选取 bookstore 元素的所有子节点

'/bookstore'  # 选取根元素 bookstore (假如路径起始于 / ,则此路径始终代表到某元素的绝对路径)

'bookstore/book'  # 选取属于 bookstore 的子元素的所有的 book 元素

'//book'      # 选取所有的 book 元素,不管其位置在哪

'bookstore//book' # 选择 bookstore 后代元素中的所有 book 元素

'//@lang'     # 选取名为 lang 的所有属性

# 谓语

'/bookstore/book[1]'    # 选取属于 bookstore 子元素的第一个book 元素

'/bookstore/book[last()]'    # 选取属于 bookstore 子元素的最后一个 book 元素

'/bookstore/book[last()-1]'  # 选取属于 bookstore 子元素的倒数第二个 book 元素

'/bookstore/book[position 

'//title[@lang]'        # 选取所有拥有名为 lang 的属性的 title 元素

'//title[@lang="lang"]'      # 选取所有 lang 属性值为 eng 的 title 元素

'/bookstore/book[price > 35.00]'   # 选取 bookstore 下,所有 price 元素值大于 35.00 的 book 元素

'/bookstore/book[price > 35.00]/title'  # 选取 bookstore 下,所有 price 元素值大于 35.00 的 book 元素的 title 子元素

# XPath 通配符

'/bookstore/*'  # 选取 bookstore 元素的所有子元素

'//*'           # 选取文档中的所有元素

'//title[@*]'   # 选取所有带属性的 title 元素

# | 运算符,可以选择若干条路径

'//book/title | //book/price'   # 选取 book 元素的所有 title 和 price 元素

'//title | //price'             # 选取文档中的所有 title 和 price 元素

'/bookstore/book/title | //price'   # 选取 bookstore/book 下的所有 title 元素,以及文档中所有的 price 元素

lxml 库

xml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取HTML/XML 数据。lxml和正则一样,也是用 C 实现的,是一款高性能的Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。# lxml 解析 xml 文档的使用示例

from lxml import etree

text = '''first itemsecond itemthird itemfourth itemfifth item

'''

# 利用 etree.HTML,将字符串解析为 HTML 文档

html = etree.HTML(text)

# 按字符串序列化 HTML 文档

result = etree.tostring(html)

print(result.decode('utf-8'))

# 注意:lxml 会自动补全缺少的闭合标签

运行结果:first itemsecond itemthird itemfourth itemfifth item

除了直接读取字符串,lxml 还支持从文件里读取内容# lxml 读取 xml 文档 的示例

from lxml import etree

# 读取外部文件 axmldoc.xml

html = etree.parse('./axmldoc.xml')

result = etree.tostring(html,pretty_print=True)

print(result.decode('utf-8'))

XPath选取信息实践获取所有的 li 标签

获取 li 标签的所有 class 属性

继续获取 li 标签下href为 link1.html 的 a 标签

获取li 标签下的所有span 标签

获取 li 标签下的 a 标签里的所有 class

获取最后一个li 的 a 的 href

获取倒数第二个元素的内容

获取 class 值为 bold 的标签名from lxml import etree

text = '''first itemsecond itemthird itemfourth itemfifth item'''

html = etree.HTML(text)

# 获取所有的 li 标签

result = html.xpath('//li')

print(result)

print('---'*10)

# 获取 li 标签的所有 class 属性

result = html.xpath('//li/@class')

print(result)

print('---'*10)

# 继续获取 li 标签下href为 link1.html 的 a 标签

result = html.xpath('//li/a[@href="link1.html"]')

print(result)

print('---'*10)

# 获取li 标签下的所有span 标签

result = html.xpath('//li//span')

print(result)

print('---'*10)

# 获取 li 标签下的 a 标签里的所有 class

result = html.xpath('//li/a//@class')

print(result)

print('---'*10)

# 获取最后一个li 的 a 的 href

result = html.xpath('//li[last()]/a/@href')

print(result)

print('---'*10)

# 获取倒数第二个元素的内容

result = html.xpath('//li[last()-1]/a/text()')

print(result)

print('---'*10)

# 获取 class 值为 bold 的标签名

result = html.xpath('//*[@class="bold"]')

print(result[0].tag)

运行结果:

[,,,,]

------------------------------

['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']

------------------------------

[]

------------------------------

[]

------------------------------

['bold']

------------------------------

['link5.html']

------------------------------

['fourth item']

------------------------------

span

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值