python爬虫入门
Posted 临风而眠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫入门相关的知识,希望对你有一定的参考价值。
python爬虫入门(8)
Xpath语法入门
Xpath用于在XML文档中搜索内容
html是xml中的一个子集
一.Xpath简介
准备工作:
pip install lxml
lxml是一种解析器
1.何为Xpath
- 解析XML的一种语言(HTML其实是XML的子级),广泛用于解析HTML数据
- 几乎所有语言都能使用XPath,比如Java和c语言
2.Xpath解析原理
-
实例化一个etree对象,且需要将被解析的页面源码加载到数据对象中
-
将本地的html文档中的源码数据加载到etree对象中:
etree.parse(filePath)
-
将网上获取的源码加载到对象中:
etree.HTML('page_text')
解析XML文档:etree.XML
-
-
调用etree对象中的Xpath方法结合Xpath表达式实现标签的定位和内容的捕获
- xpath(‘xpath表达式’)
3.Xpath语法
-
层级:
/
直接子级 、//
跳级(子孙后代) -
属性:
@
属性访问 节点上的属性
-
函数:
contains()
、text()
等
二.示例
1.XML
导入一个同目录下的xml文件来解析:
<book>
<id>l</id>
<name>东京奥运会</name>
<price>1.23</price>
<nick>接地府</nick>
<author>
<nick id="10086">体操</nick>
<nick id="10010">乒乓球</nick>
<nick class="joy">犯规</nick>
<nick class="jolin">金牌</nick>
<div>
<nick>黑幕</nick>
</div>
</author>
<partner>
<nick id="ppc">得意忘形</nick>
<nick id="ppbc">厚颜无耻</nick>
</partner>
</book>
我将之命名为2.xml
- 检验对象是否能检测到结点
from lxml import etree
tree = etree.parse('2.xml')
result=tree.xpath('/book')
print(result)
运行结果
: [<Element book at 0x1f1569adf40>]
-
提取”东京奥运会“
text()方法是提取文本
result=tree.xpath('/book/name/text()')
print(result)
运行结果
: ['东京奥运会']
- 提取nick里面的文字
比较下面几个:
result=tree.xpath('/book/nick/text()')
print(result)
运行结果
:[‘接地府’]
result=tree.xpath('/book/author/nick/text()')
print(result)
运行结果
:[‘体操’, ‘乒乓球’, ‘犯规’, ‘金牌’]
result=tree.xpath('/book//nick/text()')
print(result)
运行结果
:[‘接地府’, ‘体操’, ‘乒乓球’, ‘犯规’, ‘金牌’, ‘黑幕’, ‘得意
忘形’, ‘厚颜无耻’]
result=tree.xpath('/book/author//nick/text()')
print(result)
运行结果
:[‘体操’, ‘乒乓球’, ‘犯规’, ‘金牌’, ‘黑幕’]
此时修改一下XML
改为:
<book> <id>l</id> <name>东京奥运会</name> <price>1.23</price> <nick>接地府</nick> <author> <nick id="10086">体操</nick> <nick id="10010">乒乓球</nick> <nick class="joy">犯规</nick> <nick class="jolin">金牌</nick> <div> <nick>黑幕</nick> </div> <span> <nick>君子</nick> </span> </author> <partner> <nick id="ppc">得意忘形</nick> <nick id="ppbc">厚颜无耻</nick> </partner> </book>
此时想要提取 ’黑幕‘,’君子‘该怎么做?
使用通配符*,表示任意结点
result=tree.xpath('/book/author/*/nick/text()')
print(result)
运行结果
:[‘黑幕’, ‘君子’]
注:若将xml文档放入程序,则用etree.XML()来解析
from lxml import etree xml = """ <book> <id>l</id> <name>东京奥运会</name> <price>1.23</price> <nick>接地府</nick> <author> <nick id="10086">体操</nick> <nick id="10010">乒乓球</nick> <nick class="joy">犯规</nick> <nick class="jolin">金牌</nick> <div> <nick>黑幕</nick> </div> <span> <nick>君子</nick> </span> </author> <partner> <nick id="ppc">得意忘形</nick> <nick id="ppbc">厚颜无耻</nick> </partner> </book> """ tree = etree.XML(xml) result = tree.xpath('/book/author//nick/text()') print(result)
2.HTML
把以下保存为一个HTML文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<ul>
<li><a href="http://www.baidu.com">百度</a></li>
<li><a href="http://www.google.com">谷歌</a></li>
<li><a href="http://www.sogou.com">搜狗</a></li>
</ul>
<ol>
<li><a href="feijii">飞机</a></li>
<li><a href="dapao">大炮</a></li>
<li><a href="huoche">火车</a></li>
</ol>
<div class="job">李嘉诚</div>
<div class="common">胡辣汤</div>
</body>
</html>
- 提取里面的百度、谷歌、搜狗这几个文字
from lxml import etree
tree = etree.parse('a.html')
result=tree.xpath('/html/body/ul/li/a/text()')
print(result)
若不想全都提取,想只提取某一个呢?
用索引,这里是从1开始,不是从0开始
result1 、result2 、 result3 分别是百度 谷歌 搜狗
result1 = tree.xpath('/html/body/ul/li[1]/a/text()')
result2 = tree.xpath('/html/body/ul/li[2]/a/text()')
result3 = tree.xpath('/html/body/ul/li[3]/a/text()')
- 根据属性提取,如根据href=‘dapao’提取 大炮 文字
result = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()")
print(result)
# 浏览器里复制的Xpath:/html/body/ol/li[2]/a
注意根节点前面的
/
别忘!!!
- 遍历
<li>
ol_li_list=tree.xpath('/html/body/ol/li')
for li in ol_li_list:
print(li)
运行结果
<Element li at 0x19ab42810c0>
<Element li at 0x19ab4281200>
<Element li at 0x19ab4281240>
若要从每一个li中提取文字,则要在每一个li中继续使用Xpath
此时是相对查找,用==./
==(./
表示当前结点),实现方法如下:
ol_li_list=tree.xpath('/html/body/ol/li')
for li in ol_li_list:
content=li.xpath('./a/text()')
print(content)
若要提取a标签的href属性的值呢?
ol_li_list=tree.xpath('/html/body/ol/li')
for li in ol_li_list:
content=li.xpath('./a/@href')
print(content)
一半提取ul和ol里面的a标签的属性的值:
print(tree.xpath('/html/body/*/li/a/@href'))
运行结果
['http://www.baidu.com', 'http://www.google.com', 'http://www.sogou.com', 'feiji', 'dapao', 'huoche']
小技巧:
可以直接在检查页面复制Xpath
以上是关于python爬虫入门的主要内容,如果未能解决你的问题,请参考以下文章