python(爬虫篇)——Xpath提取网页数据
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;
虽然永远无法预料明天是晴还是雨,
也无法预知你在乎的人是否还在身旁,
以及你一直以来的坚持究竟能否换来什么。
但你能决定的是,
今天有没有备好雨伞,
有没有好好爱自己,
以及是否为自己追求的理想而拼尽全力。
目录
python爬虫之xpath使用
Xpath是什么?
XPath即为XML路径语言
(XML Path Language),它是一种用来确定
XML文档中某部分位置的语言。
XPath基于XML的树状结构
,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快地被开发者采用来当作小型查询语言。
安装xpath库
1、我们需要进入当前我们这个项目的Scripts目录打开cmd
查看目录方法:在pycharm中file -> setting -> Project: exercise -> Project Interpreter查看其中的 Project Interpreter 中的地址
2、进入cmd进入该目录
3、安装
pip install lxml
如果没有在项目下pip可能会报错,但是放心这里虽然报错但是可以运行
xpath语法介绍
路径常用规则
nodename
:选取此节点的所有子节点/
:从根节点选取//
:选取所有节点,不考虑位置.
:选取当前节点..
:选取当前节点的父节点@
:选取属性谓语规则
谓语被镶嵌在方括号内用来查找某个特定的节点或者包含某个特定的值的节点
xpath('/body/div[1]')
:选取body下的第一个div节点xpath('/body/div[last()]')
:选取body下最后一个div节点xpath('/body/div[last()-1]')
:选取body下倒数第二个div节点xpath('/body/div[positon()]')
:选取body下前两个div节点xpath(/body/div[@class]')
:选取body下带有class属性的div节点xpath('/body/div[@class="main"]')
:选取body 下class属性为main的div节点xpath('/body/div[price>35.00]')
:选取body 下price元素值大于35的div节点通配符
xpath ('/div/*')
:选取div下的所有子节点xpath('ldiv[@*]')
:选取所有带属性的div节点xpath('//div|//table')
:选取所有的div和table节点使用"|”运算符可以选取多个路径
函数介绍
starts-with
:例xpath('I/div[starts-with(@id,"ma")J')
选取id值以ma开头的div节点contains
:例xpath('lldiv[contains(@id, "ma")J')
选取id值包含ma的div节点and
:例xpath('I/div[contains(@id,"ma") and contains(@id,"in")J')
选取id值包含ma和in的div节点text()
:例xpath('I/div[contains(text(), "ma"))
选取节点文本包含ma的div节点xpath使用范例
from lxml import etree
wb_data = """
<div>
<ul>
<li class="item-0"><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(wb_data)
print(html)
result = etree.tostring(html)
print(result.decode("utf-8"))
我们输出了一个html对象,使用etree.tostring(html)
方法可以补全我们在html里没有完成的标签,所以给我们补上了最后一个a标签的后半部分,而且给我们补上了<html><body>
1、使用/
获取某个标签的内容
from lxml import etree
wb_data = """
<div>
<ul>
<li class="item-0"><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(wb_data)
html_data = html.xpath('/html/body/div/ul/li/a')
print(html)
for i in html_data:
print(i.text)
这里还有另外一种方法,可以在需要找的内容后面加/text()就行
html = etree.HTML(wb_data)
html_data = html.xpath('/html/body/div/ul/li/a/text()')
print(html)
for i in html_data:
print(i)
效果于上面相同
2、打开读取html文件
新建html文档hello.html编写如下内容
<div>
<ul>
<li class="item-0"><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></li>
</ul>
</div>
试着打开读取html
方法一、
#使用parse打开html的文件
html = etree.parse('hello.html')
html_data = html.xpath('//*')<br>#打印是一个列表,需要遍历
print(html_data)
for i in html_data:
print(i.text)
方法二、
html = etree.parse('test.html')
html_data = etree.tostring(html,pretty_print=True)
res = html_data.decode('utf-8')
print(res)
输出结果
3、打印指定路径下a标签的属性(可以通过遍历拿到某个属性的值,查找标签的内容)
html = etree.HTML(wb_data)
html_data = html.xpath('/html/body/div/ul/li/a/@href')
for i in html_data:
print(i)
输出结果
4、查找到绝对路径下a标签属性等于link2.html的标签
我们知道我们使用xpath拿到得都是一个个的ElementTree对象,所以如果需要查找内容的话,还需要遍历拿到数据的列表。
html = etree.HTML(wb_data)
html_data = html.xpath('/html/body/div/ul/li/a[@href="link2.html"]/text()')
print(html_data)
for i in html_data:
print(i)
输出结果:
5、使用绝对路径查找,查找li标签下的a标签内容
html = etree.HTML(wb_data)
html_data = html.xpath('//li/a/text()')
print(html_data)
for i in html_data:
print(i)
输出结果:
6、使用相对路径查找li标签下的href属性的值
html = etree.HTML(wb_data)
html_data = html.xpath('//li/a//@href')
print(html_data)
for i in html_data:
print(i)
输出结果:
7、相对路径下跟绝对路经查找特定属性的方法相同
html = etree.HTML(wb_data)
html_data = html.xpath('//li/a[@href="link2.html"]')
print(html_data)
for i in html_data:
print(i.text)
输出结果:
8、查找最后一个li标签里的a标签的href属性
html = etree.HTML(wb_data)
html_data = html.xpath('//li[last()]/a/text()')
print(html_data)
for i in html_data:
print(i)
输出结果:
9、查找倒数第二个li标签里的a标签的href属性
html = etree.HTML(wb_data)
html_data = html.xpath('//li[last()-1]/a/text()')
print(html_data)
for i in html_data:
print(i)
输出结果:
10、提取某个页面的某个标签的xpath路径