1,数据提取之lxml模块与xpath工具
lxml是一款高新能的python html/xml解析器,我们可以利用xpath,来快速的定位特定元素以及获取节点信息
2,谷歌浏览器xpath helper插件的安装和使用
3,xpath语法--基础节点选择语法
4, xpath语法-节点修饰语法
5,xpath语法-其他常用节点选择语法
// 的用途
- //a 当前html页面上的所有的a
- bookstore//book bookstore下的所有的book元素
@ 的使用
- //a/@href 所有的a的href
- //title[@lang="eng"] 选择lang=eng的title标签
text() 的使用
- //a/text() 获取所有的a下的文本
- //a[texts()='下一页'] 获取文本为下一页的a标签
- a//text() a下的所有的文本
xpath查找特定的节点
- //a[1] 选择第一个a
- //a[last()] 最后一个
- //a[position()<4] 前三个
包含
- //a[contains(text(),"下一页")]选择文本包含下一页三个字的a标签**
- //a[contains(@class,'n')] class包含n的a标签
6,lxml模块的安装与使用示例
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>
'''
# html = etree.HTML(text)
# 获取href的列表和title的列表
#【方式一】
# href_list = html.xpath("//li[@class='item-1']/a/@href") #取属性
# title_list = html.xpath("//li[@class='item-1']/a/text()") #取文本
# # print(href_list)
# # print(title_list)
#组装成字典
# for href in href_list:
# item = {}
# item["href"] = href
# item["title"] = title_list[href_list.index(href)] #index取出文本
# print(item)
# 【方式二】
html = etree.HTML(text)
li_list = html.xpath("//li")
# 遍历列表
for li in li_list:
item = {}
# li :element xpath--返回列表
item['href'] = li.xpath("./a/@href")[0] if len(li.xpath("./a/@href") )>0 else None
item['title'] = li.xpath("./a/text()")[0] if len(li.xpath("./a/text()") )>0 else None
print(item)
7.lxml的自动补全html以及文件访问 etree.tostring(html).decode()
lxml.etree.HTML(html_str)可以自动补全标签
lxml.etree.tostring
函数可以将转换为Element对象再转换回html字符串爬虫使用lxml来提取数据,应该以
lxml.etree.tostring
的返回结果作为提取数据的依据
##### 知识点:掌握 lxml模块中使用xpath语法定位元素提取属性值或文本内容
##### lxml模块中etree.tostring函数的使用
####> 运行下边的代码,观察对比html的原字符串和打印输出的结果
from lxml import etree
# html_str = ''' <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> '''
# 1,lxml.etree.HTML(html_str) 可以自动补全标签
# html = etree.HTML(html_str) #利用etree.HTML,将字符串解析为HTML文档
# # print(html) #大的元素
# handeled_html_str = etree.tostring(html).decode() # 按字符串序列化HTML文档 #元素变成字符串,自定补全标签
# print(handeled_html_str)
# 2,从文件读取html
# 除了直接读取字符串,lxml还支持从文件里读取内容
# 利用 etree.parse() 方法来读取文件。
html = etree.parse('./Demo.html')
# print(html)
result = etree.tostring(html).decode()
print(result)
8,XPath实例测试
from lxml import etree
html = etree.parse("./Demo.html")
# 1,获取所有的li标签
li_list = html.xpath('//li')
print(type(li_list))
print(li_list)
print(li_list[0])
print(li_list[0].xpath('./a/text()'))
# 2,继续获取li标签的所有class 属性
result = html.xpath('//li/@class')
print(result)
# 3,继续获取li标签下href为link1.html的<a>标签
result2 = html.xpath('//li/a[@href="link1.html"]')
print(result2)
print(result2[0].text)
# 4,获取li标签下的所有span标签
result3 = html.xpath('//li//span')
print(result3)
# 5,获取li标签下的a标签里的所有class
result4 = html.xpath('//li/a//@class')
print(result4)
# 6,获取最后一个li里边的a的href属性值
result6 = html.xpath('//li[last()]/a/@href')
print(result6)
# 7.获取倒数第二个元素的内容
result7 = html.xpath('//li[last()-1]/a') #标签
print(result7)
print(result7[0].text)
# 8,获取class值为bold的标签
result8 = html.xpath('//*[@class="bold"]') #标签
print(result8)
# lxml的element
print(result8[0].tag)