|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- from lxml import etree
- text = '''
- <div>
- <ul>
- <li class="item-0"><a href="link1.html"><span>first item</span></a></li>
- <li class="item-1"><a href="link2.html">second item</a></li>
- <li class="item-inactive"><a href="link3.html">third item</a></li>
- <li class="item-1"><a href="link4.html">fourth item</a></li>
- <li class="item-0"><a href="link5.html">fifth item</a>
- <ul>
- <div>
- '''
- html = etree.HTML(text)
- #所有节点
- #*代表匹配所有的节点,也可以匹配特点的节点
- result1 = html.xpath('//*')
- #子节点
- #通过/或//可查找元素的子节点和孙节点
- #/用于选取子节点,//用于选取孙节点,如果要获取所有子孙节点,就可以使用//
- result2 = html.xpath('//li/a')
- #父节点
- #查找父节点可以通过..parent::和来实现
- result3 = html.xpath('//a[@href="link4.html"]/../@class')
- result4 = html.xpath('//a[@href="link4.html"]/parent::*/@class')
- #匹配属性
- result5 = html.xpath('//li[@class="item-0"]')
- #文本获取
- result6 = html.xpath('//li[@class="item-0"]/text()')
- ##获取li节点内部的文本,一种先选取a节点在获取文本, 另一种就是使用//
- result7 = html.xpath('//li[@class="item-0"]/a/text()')
- result8 = html.xpath('//li[@class="item-0"]//text()')
- #属性获取(用@符号获取节点属性)
- result9 = html.xpath('//li/a/@href')
- text = '''
- <li class="li li-first" name="item"><a href="link.html">first item</a><li>
- '''
- html1 = etree.HTML(text)
- result10 = html1.xpath('//li[class="li"]/a/text')
- #这里的HTML文本中的li节点的class属性有两个值li/li-first,此时如果还想用之前的匹配获取,就无法匹配了
- #利用contains()方法,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值就可匹配
- result11 = html1.xpath('//li[contains(@class,"li")]/a/text()')
- #多属性匹配
- #XPath中有and/or/mod|/+等运算符
- result12 = html1.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
- # print(result12)
- #按顺序选择
- result13 = html.xpath('//li[1]/a/text()')
- # print(result13)
- result14 = html.xpath('//li[last()]/a/text()')
- # print(result14)
- result15 = html.xpath('//li[position()<3]/a/text()')
- # print(result15)
- result16 = html.xpath('//li[last()-2]/a/text()')
- # print(result16)
- #这里的序列是从1开始的,而不是从0开始,last()是最后一个,last()-2为导数第三个,而position<3, 为前2个
- #在XPath中提供了100多个函数,可参考:https://www.cnblogs.com/zhangfei/archive/2013/02/27/2935264.html
- #节点轴选择
- ##调用ancetor轴,可以获取所有的祖先节点,其后需要跟两个冒号,然后是节点选择器:*表示匹配所有的节点
- result17 = html.xpath('//li[1]/ancestor::*')
- # print(result17)
- #在后面加上div限制,还可以加html/boby/div/ul等
- result18 = html.xpath('//li[1]/ancestor::div')
- print(result18)
- #调用attribute轴,可以获取所有的属性值,其后跟的选择器还是*,这代表获得该节点的所有的属性
- result19 = html.xpath('//li[1]/attribute::*')
- print(result19)
- #调用child轴,可以获得所有直接子节点。这里加了限定条件,选取href属性为link1.html的a节点
- result20 = html.xpath('//li[1]/child::a[@href="link1.html"]')
- print(result20)
- #调用descendant轴,获取孙节点。
- result21 = html.xpath('//li[1]/descendant::span')
- print(result21)
- #选取following轴,获取当前节点之后的所有节点,虽然使用*匹配,但加了索引
- result22 = html.xpath('//li[1]/following::*[2]')
- print(result22)
- #调用following-slibling轴,可以获取当前节点之后的所有同级节点
- result23 = html.xpath('//li[1]/following-sibling::*')
- print(result23)
复制代码
|
|