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