您的位置:首页 > 其它

lxml中xpath语法的使用

2018-02-28 22:22 507 查看
#coding:utf-8
#__author__='wang'

#lxml第三方的HTML解析库在对HTML进行解析的时候,使用的xpatn语法,xpath是通过
路径的形式在HTML中选择节点

#etree:element etree元素树,元素指的就是HTML中的标签
from lxml import etree

#加载本地HTML文件
#html是一个ElementTree类型的对象
html = etree.parse('index.html')
# print type(html)
# print html

#tostring()是将一个ElementTree类型的对象转换成一个HTML字符串,pretty_print
美化输出
# result = etree.tostring(html,pretty_print=True)
# print type(result)
# print result

#fromstring()是将一段字符串转换成一个Element对象
# html = """
# <a href='http://www.zhihu.com'>知乎</a>
# """
# result = etree.fromstring(html)
# print type(result)
# print result

#如何从本地HTML中提取标签及标签内容
#1.//a:表示从当前文档中搜索a标签而不考虑a标签的位置
# a = html.xpath('//a')
# print a
#2.获取a标签的class属性、href属性值,获取属性时一定要使用@
# result = html.xpath('//a/@class')
# result = html.xpath('//a/@id')
# result = html.xpath('//a/@href')
# print result
#3./text():只获取标签文本内容,子标签的文本内容无法获取
# result = html.xpath('//a/text()')
# result = html.xpath('//p/text()')
# result = html.xpath('//div/text()')

#//text():可以将该标签以及该标签所有子标签内的文本内容全部获取出来
# result = html.xpath('//div//text()')
# for res in result:
#     print res

#4.获取ul标签内的li标签内的a标签,并且a标签的id是second_a的一个标签
#[@id="second_a"]:通过属性对要查找的标签进行限制
# result = html.xpath('//ul/li/a[@id="second_a"]/text()')
# print result[0]

#5.last():获取ul标签下的最后一个li标签
# result = html.xpath('//ul/li[last()]')[0]
#在li这个Element对象的基础上继续使用xpath进行下一步的元素定位
# result = result.xpath('a[@class="first_a"]/text()')
# print result
#
# result = html.xpath('//ul/li[2]')[0]
#
# result = result.xpath('a[@href]')[0]
# print result

#contains(@class,"first"):查找class属性值中包含first值的标签,一般用在class
属性值比较多的时候
result = html.xpath('//div[@class="one"]/p[contains(@class,"first")]
/text()')[0]
print result

#除了有contains函数,还有class属性以xx开头的判断函数,以xx结尾的判断函数

#如果解析的是一段HTML源码字符串
html_string = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>lxml中xpath的用法</title>
</head>
<body>
<ul>
<li><a href="http://www.baidu.com" class="first_a">百度一下
</a></li>
<li><a href="http://mail.qq.com" id="second_a">QQ邮箱</a></li>
<li><a href="http://www.taobao.com" class="first_a">淘宝网</a>
</li>
<li><a href="http://pypi.python.com" class="second_a">Python
</a></li>
</ul>
<p class="one">first_p_tag</p>
<p id="second">second_p_tag</p>
<div class="one">
first_p_tag
<p class="first second third">1111</p>
<a href="#">2222</a>

</div>
</body>
</html>
"""
# html_object = etree.HTML(html_string)
# print type(html_object)
# print html_object
#
# result = html_object.xpath('//div/a/text()')
# print result[0]
#/xpath路径语法中的/,一个斜杠的含义只能查询下一级的直接子节点,而子节点的子节点
是无法获取的
#xpath路径中的//,含义就是可以查询路径中的子孙节点
# result = html_object.xpath('//ul//a/text()')
# print result[0]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: