6. xml数据提取-xpath语法使用

1. xpath

1.1 xpath helper插件在谷歌浏览器安装

用以输入xpath语句对内容定位

1.2 xpath 节点

<book>   
   <title>Harry Potter</title>
   <author>J K. Rowling</author>
   <year>2005</year>
   <price>29.99</price>
 </book> 

book为根节点
title为book的子节点

1.3 xpath 语法

符号描述
//任意位置
/从根节点开始
.当前节点
. .上一节点
@选取属性
text()选取文本
[ ]定位
|选取多个
  • xml代码
 <?xml version="1.0" encoding="ISO-8859-1"?>

 <bookstore>

 <book>
   <title lang="eng">Harry Potter</title>
   <price>29.99</price>
 </book>

 <book>
   <title lang="eng">Learning XML</title>
   <price>39.95</price>
   <a href='http://www.baidu.com'> haha </a>
 </book>

 </bookstore> 
示例描述
//price选出所有price元素
//title/text()选择出所有的title中文本
bookstore所有bookstore的子节点
/bookstore选择根节点
//book[1]选取第一个book
//book[last()-1]选取倒数第二个
//book[postion() < 3]前两个book
//title[@lang]title中拥有lang属性的
//title[@lang=‘eng’]title中拥有lang='eng'属性的
//book[price>35]/titleprice>35book元素的title
//title | //price同时选择titleprice元素
//title/text()选取title包含的文本Harry Potter Learning XML
//a/@href选择a元素的属性href的内容http://www.baidu.com

2. 对HTML文本进行xpath提取

2.1 转换HTML为element元素,便可调用xpath方法

from lxml import etree
data = etree.HTML(html)
data_list = data.xpath('字符串语法规则') # 提取数据

2.2 代码示例

from lxml import etree

text = ''' 
<div> 
  <ul> 
    <li class="item-1">
      <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">third item</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>
'''
# 方法一: 分别提取对应输出,但是如果当缺少其中的href或text()时对应关系错位
html = etree.HTML(text)

href_list = html.xpath('//a/@href')
text_list = html.xpath('//a/text()')

for a, b in zip(text_list, href_list):
    print(a,b)

# 方法二:但是如果当缺少其中的href或text()时对应关系错位
a = html.xpath('//a/@href | //a/text()')
print(a)

# 方法三:将同一元素放置一起,当缺少其中的href或text()时会报错
e = html.xpath('//a')  # 提取a元素
for s in e:
    print(s.xpath('./@href')[0], s.xpath('./text()')[0])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值