parsel的使用


parsel的使用

parsel库可以解析HTML和XML,并支持使用xpath和css选择器对内容进行提取和修改,支持三大功能:.css(),.xpath(),.re()

1.初始化

在使用css选择器,xpath还是re,都先需要创建一个Selector对象

from parsel import Selector

html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
selector = Selector(text=html)
item = selector.css('.item-0')  # 选取属性包含.item-0的节点
"""
从item这个输出结果可以看出使用css选择器筛选出来的节点是xpath属性的,这是因为使用传入的css选择器会首先转变成xpath,真正用于提取节点的是xpath
"""
"""从item这个输出结果的类型可以看出是可迭代对象SelectorList,如果需要获取所有的li节点就需要使用遍历"""
print(len(item), type(item), item)
item1 = selector.xpath('//li[contains(@class="item-0")]')  # 选取属性包含.item-0的节点
print(item1)  
"""
这两种方法输出的结果都是一样的
"""

2.提取文本

from parsel import Selector

html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
selector = Selector(text=html)
items = selector.css('.item-0')
for item in items:
    text = item.xpath('.//text()').get()  # get方法的作用是从Selectorlist里面提取一个Selector对象,然后输出其中的结果
    print(text)

items2 = selector.xpath('//li[contains(@class, "item-0")]//text()').get()
"""先将所有属性值包含item-0的节点选出来,然后使用get方法将Selector对象提取出来,总共选择了3个li节点,但是返回的只有第一个节点的文本内容,
这是因为get方法只提取第一个Selector对象"""
print(items2)

items3 = selector.xpath('//li[contains(@class, "item-0")]//text()').getall()
print(items3)

items4 = selector.css('.item-0 *::text').getall()  # *用来提取所有子节点,提取文本需要使用::text
print(items4)
"""最终的输出结果都是一样的"""

3.提取属性

from parsel import Selector

html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
selector = Selector(text=html)
items = selector.css('.item-1 a::attr(href)').getall()  # 提取所有属性值包含item-1的节点下a节点的href属性
print(items)
items1 = selector.xpath('//li[contains(@class, "item-1")]/a/@href').getall()
print(items1)
“”“这两种方法的结果是一样的”“”

4.正则提取

from parsel import Selector

html = '''
<div>
    <ul>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
'''
selector = Selector(text=html)
items = selector.css('.item-1').re('link.*?l')  # 提取class属性值包含item-1的li节点,然后使用正则将a节点下的href属性中的link提取出来
print(items)
items1 = selector.css('.item-0 *::text').re('.*item')  # 提取class属性值包含item-0的li节点的文本,然后使用正则将内容提取出来
print(items1)
items2 = selector.css('.item-0 *::text').re_first('.*item')  # 选取第一个匹配正则表达式的内容
print(items2)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM