一、首先,先了解几个概念:
XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。
二、安装lmxl模块:
pip install lxml
三、xpath解析
<book>
<id>1</id>
<name>野花遍地香</name>
<price>1.23</price>
<author>
<nick>周大强</nick>
<nick>周芷若</nick>
</author>
</book>
在上述htlm中,
1. book, id, name, price....都被称为节点。
2. Id, name, price, author被称为book的子节点
3. book被称为id, name, price, author的父节点
4. id, name, price,author被称为同胞节点
OK~有了这些基础知识后,我们就可以开始了解xpath的基本语法了
四、用法:
1.将要解析的html内容构造出etree对象。
2.使用etree对象的xpath(方法配合xpath表达式来完成对数据的提取
from lxml import etree
xml ="""
<book>
<id>1<id>
<name>野花遍地香</name>
<price>1.23</price>
<nick>昊豆腐</nick>
<author>
<nick id="100116">周一</nick>
<nick id="100110”>周二</nick>
<nick class="joy">周三</nick>
<nick class="makew">周四</nick>
<div>
<nick>hhhhh</nick>
</div>
<span>
<nick>aaaa</nick>
</span>
</author>
<partner>
<nick id="1111">abc</nick>
<nick id="2222">abcd</nick>
</partner>
</book>
"""
tree=etree.XML(xml)
res=tree.xpath("/book") # /表示层级关系,第一个/表示根节点
res=tree.xpath("/book/name/text()") # text() 拿文本
res=tree.xpath("/book/author//nick/text()") #// 表示后代
res=tree.xpath("/book/author/*/nick/text()") # * 任意节点/通配符
res=tree.xpath("/book//nick/text()")
print(res)
那么如果在上述案例中我们只想拿到 ”百度“ 这个信息该怎么办呢
res=tree.xpath("/book/body/ul/li[1]/a/text()") # [] 表示索引,xpath的顺序从1开始
还有另一种方法比如提取“大炮”这个信息
res=tree.xpath("/book/body/ol/li/a[@href='dapao']/text()") #[@xxx=xxx] 属性的筛选
那么我们怎么遍历呢
ol_li_list = tree.xpath("/html/body/ol/li")
for li in ol_li-list:
# 从每一个li中提取到文字信息
res=li.xpath("./a/text()") # 这个查找不是从根节点去找而是在li中继续去寻找,相对查找
# ./表示当前结点
res1=li.path("./a/@href") # 拿属性值:@xxx
print(res)
print(res1)
那么不用遍历怎么拿到全部属性值呢(以ul中的为例)
print(tree.xpath("/html/body/ul/li/a@href"))
如果遇到复杂的代码这么写就显得有些费力了 showtime
在网页中右键找 查找 然后我们可以看到左上角有个箭头的东东点击这个我们可准确确定到想要的信息
在右键
复制之后就是这个状态
print(tree.xpath('/html/body/div[1]/text()')) #注意补齐
如果把[]这个去掉就和循环遍历一样的效果了