chenhongl

导航

 
import parsel  #html_str --> parsel转对象--> xpath获取数据(返回数据列表)

html_str = """
<div>
<ul>
<li class="item-0" id='test'><a href="link1.html">item1</a></li>
<li class="item-1"><a href="link2.html">item2</a></li>
<li class="item-inactive"><a href="link3.html">item3</a></li>
<li class="item-1"><a href="link4.html">item4</a></li>
<li class="item-0"><a href="link5.html">item5</a>
</ul>
</div>
"""


1、转换数据类型(parsel)
data = parsel.Selector(html_str)
print(data) #对象 <Selector query=None data='<html><body><div>\n <ul>\n ...'>
data = parsel.Selector(html_str).extract() # parsel可以把缺失的HTML标签补充完整

经过转化后,原来的字符串发生了一些变化:

parsel可以把缺失的HTML标签补充完整:



2、① 从根节点开始,获取所有a标签
result = data.xpath('/html/body/div/ul/li/a').extract() #extract()对于数据进行提取
print(result) #['<a href="link1.html">first item</a>', '<a href="link2.html">second item</a>'....]

2、② 跨节点获取所有a标签
result1 = data.xpath('//a').extract()
print(result1)

2、③ .选取当前节点 使用场景:需要对选取的标签的下一级标签进行二次/多次提取
获取ul标签下面的所有li标签
第一步:获取ul标签
result2 = data.xpath('//ul') #第一步不能用extract,保持标签对象的状态
第二步:提取li标签
result3 = result2.xpath('./li').extract() #.指代当前节点(第一步获取的节点)
print(result3.extract())
同样,获取所有的a标签
print(result2.xpath('./li/a').extract()) #.指代当前节点(第一步获取的节点)

2、④ .. 获取当前节点的父节点,获取父节点的class属性值
第一步:定位当前节点
result4 = data.xpath('//a')
第二步:
print(result4.xpath('../@class').extract()) #..指当前节点的父节点;@ 指获取xx属性值

2、⑤ 获取第三个li标签(两种方法)
方法一:
result5 = data.xpath('//li[3]').extract() #注意:这里的计算机索引,从数字1开始
方法二:
result5 = data.xpath('//li')[2].extract() #注意:这里的是列表的索引,从数字0开始
print(result5)

2、⑥通过定位属性的方法获取第四个a标签(精准定位)
result6 = data.xpath('//a[@href="link4.html"]').extract()
print(result6)

2、⑦通过定位属性的方法获取第四个a标签包裹的文本内容
result7 = data.xpath('//a[@href="link4.html"]/text()').extract() #['item4']
print(result7)

2、⑧获取第五个a标签的href属性值 @+属性值
result8 = data.xpath('//li[5]/a/@href').extract() #['link5.html']
print(result8)

2、⑨获取全部5个a标签下的href属性值 @+属性值
第一步:获取所有a标签的href属性值
result9 = data.xpath('//a/@href').extract() #['link5.html']
print(result9)

3、模糊查询
获取所有的li[包含(@属性名, '属性值')]
result10 = data.xpath('//li[contains(@class,"item")]').extract()
print(result10)

4、如何选取多个标签(在路径表达式中用 | 或运算符)
同时获取li标签的属性和a标签的文本
result11 = data.xpath('//li/@class|//a/text()').extract()
print(result11)

5、* 通配符,获取未知节点

工具:XpathHelperPlus https://gitcode.com/mic1on/xpath-helper-plus/tags
获取的目标数据太多,可以先获取到该标签的父标签
# //p[@claa="name"]/a/text()

 

 

 

 

 

 

 

posted on 2024-05-30 17:14  chenhongl  阅读(3)  评论(0编辑  收藏  举报