當前位置:首頁 » 編程語言 » pythonattrs

pythonattrs

發布時間: 2025-02-25 00:55:22

python自帶的用於解析HTML的庫HtmlParser


Python語言中內置的HtmlParser庫,是一個專為HTML解析設計的工具。它的設計思路是通過繼承並重載特定的方法,以便從HTML結構中提取所需的數據。


HtmlParser的核心在於其類中的屬性和方法。其中,lasttag屬性記錄了上一個解析的標簽名稱,提供歷史信息。主要方法包括handle_starttag,當遇到開始標簽如<div>時,會調用此函數,attrs參數則傳遞了屬性列表,通常以元組形式呈現。


要開始使用HtmlParser,你可以參考Python官方文檔提供的簡單示例,通過解析一個基礎的HTML文檔,理解各函數的作用和解析流程。在此基礎上,可以嘗試一些實用場景。例如:



  • 創建一個靜態函數,直接獲取特定屬性值,無需處理開始標簽。

  • 僅修改handle_data函數,獲取所有p標簽的文本內容。

  • 針對具有特定class(如p_font)的p標簽,通過實例屬性篩選並提取文本。

  • 獲取p標簽的屬性列表,包括其所有屬性。

  • 提取p標簽的class屬性,進行進一步分析。

  • 在div元素下的p標簽中,提取文本內容。

  • 如果數據隱藏在HTML注釋中,可以創建兩個繼承自HTMLParser的子類,一個用於處理正常標簽,另一個在handle_comment方法中解析注釋中的內容。



以上案例展示了HtmlParser在實際應用中的靈活性和擴展性,可以根據需要進行定製和優化。這個庫是Python開發中處理HTML數據的強大工具。

⑵ Python爬蟲:HTML網頁解析方法小結

要理解python是如何解析網頁的,首先要理解什麼是網頁解析器。

簡單的說就是用來解析html網頁的工具,准確的說:它是一個HTML網頁信息提取工具,就是從html網頁中解析提取出「我們需要的有價值的數據」或者「新的URL鏈接」的工具。

解析HTML:

我們知道爬蟲的原理無非是把目標網址的內容下載下來存儲到內存中,這個時候它的內容其實是一堆HTML,然後再對這些HTML內容進行解析,按照自己的想法提取出想要的數據。

今天主要講講Python中解析網頁HTML內容的四種方法:

其中BeautifulSoup和XPath是python中解析網頁常用的兩個庫,對於新手來說是利器,零基礎小白建議先打好Python基礎再去上手爬蟲會容易一些。

「零基礎如何學Python」在知乎看到過一篇比較好的問答貼,講的很實用,大傢伙可以移步去看看,鏈接分享在下方。

1、BeautifulSoup

大名鼎鼎的BeautifulSoup庫,在Pyhton的HTML解析庫里屬於重量級的庫。

安裝途徑:

解析的第一步,是構建一個BeautifulSoup對象。

第二個參數表示解析器,BeautifulSoup支持以下多種解釋器:

BeautifulSoup對應一個HTML/XML文檔的全部內容;

BeautifulSoup類的基本元素

任何存在於HTML語法中的標簽都可以用soup.訪問獲得,當HTML文檔中存在多個相同對應內容時,soup.返回第一個。

每個都有自己的名字,通過.name獲取,字元串類型 Tag的attrs:一個可以有0或多個屬性,字典類型 NavigableString可以跨越多個層次

1)訪問標簽

通過點號操作符,可以直接訪問文檔中的特定標簽,示例:

這樣的方式每次只會返迴文檔中的第一個標簽,對於多個標簽,則通過find_all方法返回多個標簽構成的列表。

還可以在find方法中添加過濾條件,更加精確的定位元素。

2)訪問標簽內容和屬性

通過name和string可以訪問標簽的名字和內容,通過get和中括弧操作符則可以訪問標簽中的屬性和值。

結合定位元素和訪問屬性的方法,可以方便快捷的提取對應元素,提高解析html的便利性。

使用Beautiful Soup庫解析網頁

BeautifulSoup解析內容同樣需要將請求和解析分開,從代碼清晰程度來講還將就,不過在做復雜的解析時代碼略顯繁瑣,總體來講用起來還不錯,看個人喜好吧。

爬蟲的基本技能最重要的兩點:如何抓取數據?如何解析數據?我們要活學活用,在不同的時候利用最有效的工具去完成我們的目的。

工具是其次,學習不要主末顛倒了,我上面分享的那篇文章也有提到過這個問題(鏈接有放在下方),要明確你學習的最終目的是什麼?

2、lxml的XPath

lxml這個庫同時支持HTML和XML的解析,支持XPath解析方式,解析效率挺高,不過我們需要熟悉它的一些規則語法才能使用。

使用xpath需要從lxml庫中導入etree模塊,還需要使用HTML類對需要匹配的HTML對象進行初始化。

安裝途徑:

Xpath常用表達式

使用表達式定位head和title節點

Xpath謂語常用的表達式

使用謂語定位head和ul節點

定位並獲取title節點內的文本內容

提取ul節點下的所有文本文件和鏈接地址

XPath的解析語法稍顯復雜,不過熟悉了語法的話也不失為一種優秀的解析手段。

示例:

3、requests-html

我們知道 requests 只負責網路請求,不會對響應結果進行解析,因此可以把 requests-html 理解為可以解析 HTML 文檔的 requets 庫。

requests-html 的代碼量非常少,都是基於現有的框架進行二次封裝,開發者使用時可更方便調用,它依賴於 PyQuery、requests、lxml 等庫。

安裝途徑:

需要注意的是這個庫目前只支持python3.6版本;

requests-html 具有以下特性:

requests-html默認使用session保持的請求方式,且其返回內容是一個帶有豐富方法的對象。

獲取一個隨機User-Agent

不用每次在請求頭裡面去復制user-agent;

對JavaScript的支持是requests-html最大的亮點,會用到render函數,需要注意的是第一次使用這個方法,它會先下載Chromium,然後使用Chromium來執行代碼,但是下載的時候可能需要一個梯子,這里就先不展開討論了。

學過requests庫的看到requests-html的api應該會很熟悉,使用方法基本一致,不同的是使用requests編寫爬蟲時,要先把網頁爬取下來,然後再交給BeautifulSoup等一些html解析庫,現在可以直接解析了。

示例:

通過簡短的幾行代碼,就可以把整個首頁的文章抓取下來。

示例中使用的幾個方法:

① find( ) 可以接收兩個參數:

第一個參數可以是class名稱或ID第二個參數first=True時,只選取第一條數據

② text 獲取元素的文本內容

③ attrs 獲取元素的屬性,返回值是個字典

④ html 獲取元素的html內容

使用requests-html來解析內容的好處在於作者都高度封裝過了,連請求返回內容的編碼格式轉換也自動做了,完全可以讓代碼邏輯更簡單直接,更專注於解析工作本身。

4、正則表達式

正則表達式通常被用來檢索、替換那些符合某個模式的文本,所以我們可以利用這個原理來提取我們想要的信息。

使用正則表達式, 需要導入re模塊,該模塊為Python提供了完整的正則表達式功能。

嚴格的字元匹配示例:

注意:python只支持re模塊進行正則表達式的書寫

使用正則表達式查找網頁內容中的title內容:

使用正則表達式無法很好的定位特定節點並獲取其中的鏈接和文本內容,而使用Xpath和Beautiful Soup能較為便利的實現這個功能。

正則就是編寫麻煩,理解不容易,但是匹配效率很高,不過現在有很多現成的HTMl內容解析庫之後,不太推薦再手動用正則來對內容進行匹配了,麻煩費時費力。

5、小結:

(1)正則表達式匹配不推薦,因為已經有很多現成的庫可以直接用,不需要我們去大量定義正則表達式,還沒法復用,嘗試過正則表達式的小白就能體會,使用正則表達式來篩選網頁內容是有多費勁,而且總是感覺效果不太好。

(2)BeautifulSoup是基於DOM的方式,簡單的說就是會在解析時把整個網頁內容載入到DOM樹里,內存開銷和耗時都比較高,處理海量內容時不建議使用。

BeautifulSoup不需要結構清晰的網頁內容,因為它可以直接找到我們想要的標簽,如果對於一些HTML結構不清晰的網頁,它比較適合。

(3)XPath是基於SAX的機制來解析,不會像BeautifulSoup去載入整個內容到DOM里,而是基於事件驅動的方式來解析內容,更加輕巧。

不過XPath要求網頁結構需要清晰,而且開發難度比DOM解析的方式高一點,推薦在需要解析效率時使用。

(4)requests-html 是比較新的一個庫,高度封裝且源碼清晰,它直接整合了大量解析時繁瑣復雜的操作,同時支持DOM解析和XPath解析兩種方式,靈活方便,可以嘗試。

除了以上介紹到幾種網頁內容解析方式之外還有很多解析手段,這里就暫不一一介紹了。

⑶ 【python】一文帶你了解什麼是dataclass

為什麼需要dataclass數據類

在Python 3.7(PEP 557)後引入的@dataclass裝飾器簡化了數據類的創建,通過自動生成特殊方法,如__init__() 和 __repr__()等魔術方法。數據類設計用於存儲數據、結構簡單、用於將相關的數據組織在一起、具有清晰欄位的類。使用dataclass可以更簡潔、清晰地定義數據類,減少冗餘代碼。

比較tuple、namedtuple、dict和Typing.NamedTuple,dataclass提供了類型提示,使代碼更具可讀性和可維護性。雖然tuple、namedtuple和dict各有用武之地,但在更復雜的場景中,它們的靈活性和功能限制可能不足。

使用dataclass定義復雜場景的數據類時,仍然存在一些問題,如需要實現__repr__方法來自定義描述、實現__gt__方法支持比較功能。通過這些方法的實現,數據對象可以獲得更直觀的描述和比較支持。

數據類的使用優勢包括更精確地指定每個成員變數的類型、提供欄位名的檢查、減少出錯可能性、簡潔的定義、易於閱讀和理解的類型提示以及更容易發現和修復潛在錯誤。

dataclass在一定程度上簡化了數據類的定義,但若需要精準控製程序,可能需要重載部分魔術方法。對於運動員信息存儲,使用dataclass可以更精準地控制數據類。

使用field對象可以簡化屬性的定義,例如設置默認值、比較、hash計算等。dataclass默認阻止使用可變數據做默認值,可通過field對象實現靈活設置。

數據類可以實現去重,通過設置unsafe_hash=True和控制參與比較的欄位。轉換為元組或字典,使用replace方法創建新實例,其中某些欄位的值被更改。

dataclass配合驗證工具包如marshmallow、desert可用於數據提取或參數校驗。

在許多情境下,dataclass適用於存儲數據的簡單對象,如配置信息、數據傳輸對象(DTO)、領域對象等。使用dataclass可以簡化對象建模,提高代碼質量。

在選擇dataclass或attrs時,取決於項目需求和個人喜好。dataclasses提供基本功能,而attrs提供了更多擴展性。dataclass在數據處理和對象建模中表現優異,能提升代碼清晰度和開發效率。

更多使用技巧參考官方文檔。

⑷ python 類中的私有屬性有哪些

類的私有屬性:
__private_attrs:兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。
在類內部的方法中使用時 self.__private_attrs。

類的方法:
在類地內部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數

類的私有方法 :
__private_method:兩個下劃線開頭,聲明該方法為私有方法,不能在類地外部調用。
在類的內部調用 self.__private_methods

實例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

class JustCounter:
__secretCount = 0 # 私有變數
publicCount = 0 # 公開變數

def count(self):
self.__secretCount += 1
self.publicCount += 1
print self.__secretCount

counter = JustCounter()
counter.count()
counter.count()
print counter.publicCount
print counter.__secretCount # 報錯,實例不能訪問私有變數

Python不允許實例化的類訪問私有數據,但你可以使用 object._className__attrName 訪問屬性,將如下代碼替換以上代碼的最後一行代碼:
…………………….
print counter._JustCounter__secretCount

這樣就可以訪問私有屬性了

熱點內容
四層魚缸過濾盒怎麼配置好一點 發布:2025-02-25 04:02:12 瀏覽:88
c語言刪除文件夾 發布:2025-02-25 04:02:11 瀏覽:524
javael 發布:2025-02-25 03:55:22 瀏覽:644
javafor多個變數 發布:2025-02-25 03:45:01 瀏覽:331
豐田花冠汽車有哪些配置 發布:2025-02-25 03:30:03 瀏覽:639
遼寧電腦伺服器租用雲伺服器 發布:2025-02-25 03:23:36 瀏覽:964
什麼是廣告腳本 發布:2025-02-25 03:18:21 瀏覽:60
安卓雙卡與存儲卡 發布:2025-02-25 03:17:27 瀏覽:630
自己搭建qq農場伺服器 發布:2025-02-25 03:17:27 瀏覽:447
御2帶屏什麼配置 發布:2025-02-25 03:16:08 瀏覽:613