LXML安装:pip install lxml
——xPath使用-----------------------------------------------------------------------------------
获取文本:
//标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/.../text()
获取属性值
//标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/.../@属性n
eg:-------------------------------------------------------------------
from lxml import html
def parse():
"""将html文件中内容 使用xpath进行提取"""
#读取文件中的内容
f =open('./static/index.html', 'r', encoding='utf-8')
s = f.read()
selector = html.fromstring(s)
# 解析a 标签内容
a = selector.xpath('//div[@id="container"]/a/text()')
print(a[0])
# 解析href属性
alink = selector.xpath('//div[@id="container"]/a/@href')
print(alink[0])
f.close()
if __name__=='__main__':
parse()
看下面一些例子:1)获取子节点:getchildren()等价于child::*
>>>doc.getchildren()
2)获取当前节点:"."等价于self::node()
>>>doc.xpath(".")
>>>doc.xpath("self::node()")
3)获取父节点:".."等价于parent::node()
>>>doc.head.xpath("..")
>>>doc.head.xpath("parent::node()")
4)ancestor轴和descendant轴
分别代表当前元素所有祖先元素、所有后代元素,比如:
>>>meta.xpath('ancestor::*')
>>>meta.xpath('ancestor::head')
>>>doc.xpath('descendant::table')
>>>doc.xpath('descendant::table[@id="tcdatafields"]')
>>>doc.xpath('//table[@id="tcdatafields"]')
5)ancestor-or-self和descendant-or-self轴
分别表示当前元素或其所有祖先元素、当前元素或其所有后代元素,比如:
>>>meta.xpath('ancestor-or-self::*')
,,]
6)child和parent轴
分别表示当前元素所有子元素、父元素:
>>>doc.xpath('child::head')
>>>head.xpath('child::meta[1]')
>>>head.xpath('child::meta[position()<3]')
7)attribute轴
表示当前元素的所有属性,例如下面是meta元素的name和content两个属性以及取值:
>>>meta.items()
[('name','googlebot'),('content','index,follow')]
获取所有属性取值:
>>>meta.xpath('attribute::*')
['googlebot','index,follow']
获取name属性的取值:
>>>meta.xpath('attribute::name')
['googlebot']
8)following和preceding
分别表示当前元素的所有后继元素、前置元素,比如:
>>>meta.xpath('following::*')
>>>meta.xpath('preceding::*')
9)following-sibling和preceding-sibling轴
分别表示当前元素的所有平级后继元素、平级前置元素,比如:
>>>meta.xpath('preceding-sibling::*')
>>>meta.xpath('following-sibling::*')
10)self轴
表示当前元素自身
>>>doc.xpath("self::*")
使用谓词(predicates)
谓词就是step中使用中括号[...]定义的那部分,使用谓词能实现精确查找,看下面的例子:
>>>doc.xpath('/html/head/meta')
,,,,,,]
1)位置谓词
>>>doc.xpath('/html/head/meta[1]')
>>>doc.xpath('/html/head/meta[2]')
>>>doc.xpath('/html/head/meta[last()]')
>>>doc.xpath('/html/head/meta[last()-1]')
>>>doc.xpath('/html/head/meta[position()<3]')
注:这里使用了last()和position()两个函数,xpath还支持更多的函数,结合这些函数可以获得非常强大的处理能力。
2)属性谓词
含有属性name的meta元素:
>>>doc.xpath('/html/head/meta[@name]')
,,,]
含有属性name而且其取值为robots的meta元素:
含有任意属性的meta元素:
>>>doc.xpath('/html/head/meta[@*]')
3)函数谓词
xpath内置很多函数,灵活使用这些函数,可以极大提升查找效率,比如:
-使用text()函数
>>>doc.xpath('//td[text()="2017-03-21"]')
-使用contains函数
>>>[td.textfortdindoc.xpath('//td[contains(text(),"2017-03-2")]')]
['2017-03-29','2017-03-28','2017-03-27','2017-03-24','2017-03-23','2017-03-22','2017-03-21','2017-03-20']
-使用starts-with函数
>>>[td.textfortdindoc.xpath('//td[starts-with(text(),"2017-02-2")]')]
['2017-02-28','2017-02-27','2017-02-24','2017-02-23','2017-02-22','2017-02-21','2017-02-20']
>>>[td.textfortdindoc.xpath('//td[text()>21.0andtext()<23.0]')]
['21.02']
>>>[td.textfortdindoc.xpath('//td[text()<-2.5ortext()>21.0]')]
['21.02','-2.64']
通配符
xpath也支持通配符"*",其中'*"可以匹配任何标签元素,"@*"可以匹配任何元素属性,node()可以匹配任何节点:
>>>head.xpath('./*')
,,,,,,,,,]
>>>head.xpath('./meta[@*]')
>>>head.xpath('./node()')
先格式化html(比如用制表符tab),然后以你要提取的节点开始向上查找,每个父级都相差一个制表符。如果html过于复杂,可以通过某些手段只保留html的标签结构(去除属性和内容),达到看起来清晰的目的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)