Xpath简单匹配标签内容

来源:互联网 发布:cnn student news 软件 编辑:程序博客网 时间:2024/05/31 15:18

Xpath
Xpath全程为xml路径语言,用来确定xml文档中某部分位置的语言。
使用Xpath需要安装lxml库,lxml为Python的第三方库,安装方法可以直接下载库文件手动添加到python库文件夹下或者使用pip安装。
导入模块 from lxml import etree
Selector=etree.HTML(网页源代码) 该指令可以把网页源代码转换成可以被Xpath识别和匹配的对象,
Selector.xpath() 括号内参数为一段符号。这样便可以识别匹配出感兴趣的内容。

在使用正则表达式来寻找感兴趣内容的时候,需要知道感兴趣内容附近内容的特征。
而Xpath则不同。

Xpath与HTML的结构:
HTML为树状结构,可以逐层展开,逐层定位。Xpath就是根据这一特性来工作的。
其中两根斜线 // 定位根节点,一根斜线 / 表示往下层寻找,其中一个HTML标签表示一层,提取文本内容则是 /text() ,要提取某个属性的内容则 /@xxx (xxx为具体属性的名字)。

首先,使用xpath提取一般内容:
根据HTML中的标签来进行定位。如下面一段简短代码:

# -*- coding: utf-8 -*-"""Created on Fri May 20 22:21:12 2016@author: ldl"""from lxml import etreehtml='''<!DOCTYPE html><html><head lang="en">    <meta charset="UTF-8">    <title>测试-常规用法</title></head><body><div id="content">    <ul id="useful">        <li>这是第一条信息</li>        <li>这是第二条信息</li>        <li>这是第三条信息</li>    </ul>    <ul id=“useless”>        <li>1不需要的信息</li>        <li>2不需要的信息</li>        <li>3不需要的信息</li>    </ul>    <div id="url">        <a href="属性1">这个不属于属性值</a>        <a href="属性2" href2="属性3">这个也不是属性值</a>        <a href3="attribute">3也不是属性值</a>   </div></div></body></html>'''selector=etree.HTML(html)#提取文本信息content=selector.xpath('//ul[@id="useful"]/li/text()')for each in content:    print each#此语句打印出了标签a下的内容content2=selector.xpath('//a/text()')for each in content2:    print each   #提取属性content3=selector.xpath('//a/@href')for each in content3:    print eachcontent4=selector.xpath('//a/@href2')print content4[0]content5=selector.xpath('//a[@href3="attribute"]/text()')print content5[0]

其中html代表一个简单网页的源代码,而使用etree.HTML(html)将源代码html转换成xpath可以处理的对象,然后该对象调用xpath成员进行相应处理得到感兴趣的内容。
输出文本
如上面代码所示xpath成员的参数’//ul[@id=”useful”]/li/text()’该参数表示在根目录下的ul标签[]内的内容表示当有多个ul标签的时候,用中括号中的内容来定位具体哪个标签,后面的斜杠后li代表li标签/text()表示要取的是li标签下的文本内容。此时根据该语句而得到的输出为:
这是第一条信息
这是第二条信息
这是第三条信息
该语句中如果把ul后面的中括号去掉,由于html中有两处ul标签,且两处ul标签下都有li标签,因此两处ul下的li都会定位到,因而输出:
这是第一条信息
这是第二条信息
这是第三条信息
1不需要的信息
2不需要的信息
3不需要的信息

输出属性
如上面代码中提取网页的代码:
content3=selector.xpath(‘//a/@href’)
在源代码html中,href对应的等号右边为href的属性内容,也就是href的值,其定位方式与前面文本定位方式是一样的,但是取内容方式有差别,取文本内容是直接用text(),而取属性是用@xxx,xxx为要取的属性,该表达式为取出该属性具体的内容。同理,content3=selector.xpath(‘//a/@href’)取出了a标签中href3对应的属性内容。此处由于有两处标签a下都有href,因而返回两处属性都会返回,此处打印内容为:
属性1
属性2
注意,xpath取出的内容是以列表形式返回的,因而如果取出其中一个元素或者其中只有一个元素的时候,需要用访问列表元素的方式来取出。且上面的html内容比较简单,标签不复杂,因而xpath中的具体参数也比较简单,对于标签层次较多的网页文件而言,则表达式的层次结构也应该较明确,一层一层标签标示出来,否则容易导致匹配到其他有相同标签的内容上去而没有真正找出感兴趣内容。

1 0
原创粉丝点击