前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中使用Xpath

Python中使用Xpath

作者头像
慕白
发布2018-09-21 11:54:45
1.3K0
发布2018-09-21 11:54:45
举报
文章被收录于专栏:极客慕白的成长之路

XPath在Python爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线。

XPath介绍:

是什么? 全称为XML Path Language 一种小型的查询语言

说道XPath是门语言,不得不说它所具备的优点:

1) 可在XML中查找信息

2) 支持HTML的查找

3) 通过元素和属性进行导航

python开发使用XPath条件:

由于XPath属于lxml库模块,所以首先要安装库lxml,具体的安装过程可以查看博客,包括easy_installpip 的安装方法。

XPath的简单调用方法:

from lxml import etree

selector=etree.HTML(源码) #将源码转化为能被XPath匹配的格式

selector.xpath(表达式) #返回为一列表

XPath的使用方法:

首先讲一下XPath的基本语法知识:

四种标签的使用方法

1) // 双斜杠 定位根节点,会对全文进行扫描,在文档中选取所有符合条件的内容,以列表的形式返回。

2) / 单斜杠 寻找当前标签路径的下一层路径标签或者对当前路标签内容进行操作

3) /text() 获取当前路径下的文本内容

4) /@xxxx 提取当前路径下标签的属性值

5) | 可选符 使用|可选取若干个路径 如//p | //div 即在当前路径下选取所有符合条件的p标签和div标签。

6) . 点 用来选取当前节点

7) .. 双点 选取当前节点的父节点

另外还有starts-with(@属性名称,属性字符相同部分),string(.)两种重要的特殊方法后面将重点讲。

利用实例讲解XPath的使用:

代码语言:javascript
复制
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

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 con0con1

#输出结果为:

2

58 CSDN

介绍XPath的特殊用法:

1) starts-with 解决标签属性值以相同字符串开头的情况

举例说明

代码语言:javascript
复制
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(.) 标签套标签

代码语言:javascript
复制
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()来识别标签。

举两个简单的例子:

代码语言:javascript
复制
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标签

代码语言:javascript
复制
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中可以使用多重过滤方法寻找标签,例如ul3 这里使用【3】来寻找第三个ul标签 并且它的id属性值为a

获取XPath的方式有两种:

1) 使用以上等等的方法通过观察找规律的方式来获取XPath

2) 使用Chrome浏览器来获取 在网页中右击->选择审查元素(或者使用F12打开) 就可以在elements中查看网页的html标签了,找到你想要获取XPath的标签,右击->Copy XPath 就已经将XPath路径复制到了剪切板。

Demo

代码语言:txt
复制

from lxml import html

def parse():

代码语言:txt
复制
 """ 将html文件中的内容,使用xpath进行提取 """
代码语言:txt
复制
 # 读取文件中的内容
代码语言:txt
复制
 f = open('./static/index.html', 'r', encoding='utf-8')
代码语言:txt
复制
 s = f.read()

<pre><code>selector = html.fromstring(s)

解析H3标题

h3 = selector.xpath('/html/body/h3/text()')

print(h30)

解析ul下面的内容

ul = selector.xpath('/html/body/ul/li')

ul = selector.xpath('//ul/li')

print(len(ul))

for li in ul:

代码语言:txt
复制
 print(li.xpath('text()')[0])

解析ul指定的元素值

ul2 = selector.xpath('/html/body/ul/li@class="important"/text()')

print(ul2)

解析a标签的内容

a = selector.xpath('//div@id="container"/a/text()')

标签内的内容

print(a0)

href属性

alink = selector.xpath('//div@id="container"/a/@href')

print(alink0)

解析P标签

p = selector.xpath('/html/body/plast()/text()')

print(len(p))

print(p0)

test = selector.xpath('/html/body/ul/li3/text()')

print(test0)

f.close()

</code></pre>

if <strong>name</strong> == '<strong>main</strong>':

代码语言:txt
复制
 parse()

<pre><code>```

除特别注明外,本站所有文章均为慕白博客原创,转载请注明出处来自https://cloud.tencent.com/developer/article/1345616

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解析H3标题
  • 解析ul下面的内容
  • ul = selector.xpath('/html/body/ul/li')
  • 解析ul指定的元素值
  • 解析a标签的内容
  • 标签内的内容
  • href属性
  • 解析P标签
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档