XPath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re二者能够完成一样的工做,实现的功能也差很少,但XPath明显比re具备优点,在网页分析上使re退居二线。html
XPath介绍:
是什么? 全称为XML Path Language 一种小型的查询语言
说道XPath是门语言,不得不说它所具有的优势:
1) 可在XML中查找信息
2) 支持HTML的查找
3) 经过元素和属性进行导航python
python开发使用XPath条件:
因为XPath属于lxml库模块,因此首先要安装库lxml,具体的安装过程能够查看博客,包括easy_install 和 pip 的安装方法。正则表达式
XPath的简单调用方法:浏览器
from lxml import etree学习
selector=etree.HTML(源码) #将源码转化为能被XPath匹配的格式 测试
selector.xpath(表达式) #返回为一列表ui
XPath的使用方法:
首先讲一下XPath的基本语法知识:
四种标签的使用方法
1) // 双斜杠 定位根节点,会对全文进行扫描,在文档中选取全部符合条件的内容,以列表的形式返回。
2) / 单斜杠 寻找当前标签路径的下一层路径标签或者对当前路标签内容进行操做
3) /text() 获取当前路径下的文本内容
4) /@xxxx 提取当前路径下标签的属性值
5) | 可选符 使用|可选取若干个路径 如//p | //div 即在当前路径下选取全部符合条件的p标签和div标签。
6) . 点 用来选取当前节点
7) .. 双点 选取当前节点的父节点
另外还有starts-with(@属性名称,属性字符相同部分),string(.)两种重要的特殊方法后面将重点讲。url
利用实例讲解XPath的使用:spa
from lxml import etree
html="""
<!DOCTYPE html>
<html>
<head lang="en">
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div id="content">
<ul id="ul">
<li>NO.1</li>
<li>NO.2</li>
<li>NO.3</li>
</ul>
<ul id="ul2">
<li>one</li>
<li>two</li>
</ul>
</div>
<div id="url">
<a href="http:www.58.com" title="58">58</a>
<a href="http:www.csdn.net" title="CSDN">CSDN</a>
</div>
</body>
</html>
"""
selector=etree.HTML(html)
content=selector.xpath('//div[@id="content"]/ul[@id="ul"]/li/text()') #这里使用id属性来定位哪一个div和ul被匹配 使用text()获取文本内容
for i in content:
print i
#输出为
NO.1
NO.2
NO.3.net
con=selector.xpath('//a/@href') #这里使用//从全文中定位符合条件的a标签,使用“@标签属性”获取a便签的href属性值
for each in con:
print each
#输出结果为:
http:www.58.com
http:www.csdn.net
con=selector.xpath('/html/body/div/a/@title') #使用绝对路径�20 <a href="http:www.csdn.2Fa/@title') #使用相对路径定位 二者效果是同样的
print len(con)
print con[0]con[1]
#输出结果为:
2
58 CSDN
介绍XPath的特殊用法:
1) starts-with 解决标签属性值以相同字符串开头的状况
举例说明
from lxml import etree html=""" <body> <div id="aa">aa</div> <div id="ab">ab</div> <div id="ac">ac</div> </body> """ selector=etree.HTML(html) content=selector.xpath('//div[starts-with(@id,"a")]/text()') #这里使用starts-with方法提取div的id标签属性值开头为a的div标签 for each in content: print each #输出结果为: aa ab ac
2) string(.) 标签套标签
html=""" <div id="a"> left <span id="b"> right <ul> up <li>down</li> </ul> east </span> west </div> """ #下面是没有用string方法的输出 sel=etree.HTML(html) con=sel.xpath('//div[@id="a"]/text()') for i in con: print i #输出内容为left west data=sel.xpath('//div[@id="a"]')[0] info=data.xpath('string(.)') content=info.replace('\n','').replace(' ','') for i in content: print i #输出为 所有内容
XPath提供的几个特殊的方法:
XPath中须要取的标签若是没有属性,可使用text(),posision()来识别标签。
举两个简单的例子:
from lxml import etree html=""" <div>hello <p>H</p> </div> <div>hehe</div> """ sel=etree.HTML(html) con=sel.xpath('//div[text()="hello"]/p/text()') print con[0] #H
这里使用text()的方法来判别是哪一个div标签
from lxml import etree html=""" <div>hello <p>H</p> <p>J</p> <p>I</p> </div> <div>hehe</div> """ sel=etree.HTML(html) con=sel.xpath('//div[text()="hello"]/p[posision()=2]/text()') print con[0] #J
另外,在XPath中可使用多重过滤方法寻找标签,例如ul[3][@id=”a”] 这里使用【3】来寻找第三个ul标签 而且它的id属性值为a
获取XPath的方式有两种: 1) 使用以上等等的方法经过观察找规律的方式来获取XPath 2) 使用Chrome浏览器来获取 在网页中右击->选择审查元素(或者使用F12打开) 就能够在elements中查看网页的html标签了,找到你想要获取XPath的标签,右击->Copy XPath 就已经将XPath路径复制到了剪切板。