官术网_书友最值得收藏!

1.4.2 網頁數據解析庫

由于HTML文檔本身就是結構化的文本,并且具有一定的規則,所以通過解析該結構就可以提取指定的數據,于是就有了lxml、Beautiful Soup和PyQuery等網頁信息解析庫,其中,lxml庫具有很高的解析效率,并且支持XPath語法;Beautiful Soup庫翻譯成中文就是“美麗的湯”,這個奇特的名字源自于《愛麗絲夢游仙境》,可以用于從HTML或XML文件中提取數據;PyQuery庫則得名于jQuery,可以使用類似jQuery的語法對網頁中指定的數據進行解析。

1.lxml庫

lxml庫是一款高性能的HTML和XML解析器,其主要功能是解析和提取HTML或XML中的數據,并且lxml庫支持XPath語法,可以快速定位特定的元素及節點信息。關于XPath的基礎語法在《Python全棧開發——基礎入門》一書中已經詳細講解過,這里不再贅述。

可以通過lxml.etree模塊中的HTML()方法對HTML字符串進行解析,其語法格式如下:

     HTML(text)

其中,參數text表示HTML字符串。

此外,HTML()方法會返回一個_Element對象,該對象具有一個xpath()方法,用于快速定位特定的元素及節點信息。

下面就以爬取百度貼吧(Python吧)中帖子的點贊次數、標題和作者名稱為例,講解如何使用lxml庫進行網頁數據解析,示例代碼如下:

圖1-21 點贊次數、文章標題和作者名稱

2.Beautiful Soup庫

Beautiful Soup是一個高效的網頁解析庫,可以從HTML或XML文件中提取數據。其最大的特點是簡單易用,不必像正則表達式和XPath一樣需要記住很多特定的語法,盡管那樣效率會更高更直接,但是對于大多數初學網絡爬蟲的讀者來講,好用比高效更重要,因為爬取所需的數據才是最終的目的。

Beautiful Soup屬于Python的第三方庫,所以需要進行安裝,只需在命令提示符中輸入命令pip install beautifulsoup4。

在完成安裝后,需要引入該包才可以正常使用Beautiful Soup進行編程,需要注意的是,引入的包名是bs4,而不是beautifulsoup4,示例代碼如下:

     #資源包\Code\chapter1\1.4\0135.py
     import bs4

Beautiful Soup會將HTML文檔轉換成一個復雜的樹形結構,而其中的每個節點都是一個Python對象,該對象可分為4種,即BeautifulSoup對象、Tag對象、NavigableString對象和Comment對象。

1)BeautifulSoup對象

該對象表示HTML文檔的全部內容,可以通過BeautifulSoup類創建BeautifulSoup對象,其語法格式如下:

     BeautifulSoup(markup,features)

其中,參數markup表示待分析的字符串;參數features表示解析器,主要用于對HTML、XML和HTML5等進行解析,其類別如表1-11所示。

表1-11 BeautifulSoup的解析器

示例代碼如下:

2)Tag對象

該對象表示HTML文檔中的標簽,可以通過“BeautifulSoup對象+選擇器”的方式創建Tag對象,其中的選擇器包括以下3種:

(1)節點選擇器,當待獲取節點的結構層次非常清晰時,建議使用該選擇器,其使用方式如下:

     beautifulsoup.tag[.tag]

其中,beautifulsoup表示BeautifulSoup對象;tag表示標簽,如title、li、a等,注意,標簽可以進行嵌套選擇。

示例代碼如下:

(2)方法選擇器,當待獲取節點的結構層次比較復雜時,建議使用該選擇器,其包括兩種常用的方法:

一是find_all()方法。該方法用于獲取與節點名、屬性、文本內容等相符合的所有節點,并返回一個ResultSet對象,其語法格式如下:

     find_all(name,attrs,text)

其中,參數name表示節點名;參數attrs表示屬性名和屬性值組成的字典;參數text表示文本內容。

此外,通過對ResultSet對象進行迭代處理,可以進一步獲取Tag對象。

示例代碼如下:

二是find()方法。該方法用于獲取與節點名、屬性、文本內容等相符合的第1個節點,并返回一個Tag對象,其語法格式如下:

     find(name,attrs,text)

其中,參數name表示節點名;參數attrs表示屬性名和屬性值組成的字典;參數text表示文本內容。

示例代碼如下:

(3)CSS選擇器,該選擇器主要借助CSS選擇器進行節點的篩選,并且需要通過BeautifulSoup對象的select()方法實現,該方法返回一個ResultSet對象,其語法格式如下:

     select(selector)

其中,參數selector表示CSS選擇器。

示例代碼如下:

在通過上面所介紹的3個選擇器獲取Tag對象后,就可以通過Tag對象的相關屬性和方法獲取當前節點的信息,其相關屬性和方法如表1-12所示。

表1-12 Tag對象的相關屬性和方法

這里需要重點注意的是,節點中不僅只有Tag對象一種,還包括后面即將講解的NavigableString對象和Comment對象,所以在處理節點之間的關系時,如子孫節點、兄弟節點等,務必注意節點中的NavigableString對象和Comment對象。

示例代碼如下:

3)NavigableString對象

該對象表示HTML文檔中的文本內容、換行符,以及標簽中的文本內容等,可以通過“BeautifulSoup對象+string”的方式獲取NavigableString對象。

示例代碼如下:

4)Comment對象

該對象是一個特殊的NavigableString對象,表示包含注釋的文本內容。與NavigableString對象一樣,可以通過“BeautifulSoup對象+string”的方式獲取Comment對象。

示例代碼如下:

此外,還可以通過Beautiful Soup對節點進行動態修改,為在某些特定的場景下獲取節點信息帶來極大的便利。

1)刪除節點

可以通過BeautifulSoup對象的decompose()方法刪除Tag對象節點,其語法格式如下:

     decompose()

可以通過BeautifulSoup對象的extract()方法刪除Tag對象節點、NavigableString對象節點或Comment對象節點,其語法格式如下:

     extract()

示例代碼如下:

2)添加節點

首先,需要使用BeautifulSoup對象的相關方法生成一個新的節點,其常用的方法如下:

(1)new_tag()方法,該方法用于生成Tag對象節點,其語法格式如下:

     new_tag(name,**kwattrs)

其中,參數name表示標簽名;參數kwattrs表示屬性名和屬性值所組成的字典。

(2)new_string()方法,該方法用于生成NavigableString對象節點,其語法格式如下:

     new_string(s)

其中,參數s表示文本內容。

其次,在生成新的節點后,通過該節點的相關方法進行添加,其常用的方法如下:

(1)append()方法,該方法表示在當前節點的末尾添加節點,其語法格式如下:

     append(tag)

其中,參數tag表示節點。

(2)insert()方法,該方法表示在當前節點的指定位置添加節點,其語法格式如下:

     insert(position,new_child)

其中,參數position表示添加的位置;參數new_child表示節點。

(3)insert_before()方法,該方法表示在當前節點前添加節點,其語法格式如下:

     insert_before(new_child)

其中,參數new_child表示節點。

(4)insert_after()方法,該方法表示在當前節點后添加節點,其語法格式如下:

     insert_after(new_child)

其中,參數new_child表示節點。

示例代碼如下:

3)修改節點文本內容

可以通過節點的屬性string對文本內容進行修改,其語法格式如下:

     string

示例代碼如下:

4)刪除節點文本內容

可以通過節點的clear()方法對文本內容進行刪除,其語法格式如下:

     clear()

示例代碼如下:

5)修改節點屬性

可以通過“節點[屬性名]”的形式修改節點的屬性,示例代碼如下:

6)刪除節點屬性

可以通過del語句刪除節點的屬性,示例代碼如下:

7)替換節點

可以通過節點的replace_with()方法對當前節點進行替換,其語法格式如下:

     replace_with(replace_with)

其中,參數replace_with表示HTML字符串或節點,示例代碼如下:

3.PyQuery庫

具有Web前端開發經驗的程序員都知道jQuery選擇器的功能要強于CSS選擇器,因此,雖然Beautiful Soup的功能非常強大,但是其CSS選擇器的功能相對較弱,而此時PyQuery庫就是絕佳選擇了。PyQuery庫同樣是一個非常強大且靈活的網頁解析庫,是仿照jQuery語法封裝成的一個包,其語法與jQuery幾乎完全相同,可以用于網頁數據的解析。

PyQuery庫屬于Python的第三方庫,所以需要進行安裝,只需在命令提示符中輸入命令pip install pyquery。

1)解析HTML

在使用PyQuery庫提取指定節點的信息前,首先需要使用pyquery模塊中的PyQuery類對HTML數據進行解析,解析后的每個節點都是一個PyQuery對象,并且通過對該對象進行迭代,即可獲取一個HtmlElement對象。

PyQuery類可以解析以下3種格式的HTML數據:

(1)HTML字符串,該格式可以使用HTML字符串作為參數進行解析,其語法格式如下:

     PyQuery(html_str)

其中,參數html_str表示HTML字符串,示例代碼如下:

(2)URL,該格式可以使用URL作為參數進行解析,其語法格式如下:

     PyQuery(html_url)

其中,參數html_url表示URL,示例代碼如下:

     #資源包\Code\chapter1\1.4\0152.py
     from pyquery import PyQuery as pq
     pq_obj=pq(url='http://www.oldxia.com')
     print(pq_obj)
     print(type(pq_obj))

(3)HTML文件,該格式可以使用HTML文件作為參數進行解析,其語法格式如下:

     PyQuery(filename)

其中,參數filename表示HTML文件的名稱,示例代碼如下:

     #資源包\Code\chapter1\1.4\01\0153.py
     from pyquery import PyQuery as pq
     pq_obj=pq(filename='index.html')
     print(pq_obj)
     print(type(pq_obj))
2)獲取節點

在使用PyQuery類對HTML數據進行解析后,可以通過“PyQuery對象+選擇器”的方式獲取指定的節點,其中選擇器包括以下3種:

(1)節點選擇器,當需要獲取節點的結構層次非常清晰時,建議使用該種選擇器,其使用方式如下:

     pyquery(tag)

其中,pyquery表示PyQuery對象;tag表示標簽,如title、li、a等,注意,標簽可以進行嵌套選擇,示例代碼如下:

(2)jQuery選擇器,該選擇器主要借助jQuery選擇器進行節點的篩選,其使用方式如下:

     pyquery(selector)

其中,pyquery表示PyQuery對象;selector表示jQuery選擇器,示例代碼如下:

(3)方法選擇器,當需要獲取節點的結構層次比較復雜時,建議使用該選擇器,其包括以下5種常用的方法:

一是find()方法,該方法用于獲取符合條件的所有節點,其語法格式如下:

     find(selector)

其中,參數selector表示節點選擇器或jQuery選擇器。

二是children()方法,該方法用于獲取符合條件的所有直接子節點,其語法格式如下:

     children(selector)

其中,參數selector為可選參數,表示節點選擇器或jQuery選擇器,默認表示無條件。

三是parent()方法,該方法用于獲取符合條件的直接父節點,其語法格式如下:

     parent(selector)

其中,參數selector為可選參數,表示節點選擇器或jQuery選擇器,默認表示無條件。

四是parents()方法,該方法用于獲取符合條件的所有祖先節點,其語法格式如下:

     parents(selector)

其中,參數selector為可選參數,表示節點選擇器或jQuery選擇器,默認表示無條件。

五是siblings()方法,該方法用于獲取符合條件的所有兄弟節點,其語法格式如下:

     siblings(selector)

其中,參數selector為可選參數,表示節點選擇器或jQuery選擇器,默認表示無條件。

示例代碼如下:

3)獲取節點信息

在獲取節點后,可以通過HtmlElement對象或PyQuery對象的相關屬性和方法提取節點的信息。

(1)HtmlElement對象,通過對PyQuery對象進行迭代或使用索引方式就可以得到HtmlElement對象,其相關屬性和方法如表1-13所示。

表1-13 HtmlElement對象的相關屬性和方法

示例代碼如下:

(2)PyQuery對象,該對象的相關方法如表1-14所示。

表1-14 PyQuery對象的相關方法

此外,由于對PyQuery對象進行迭代所獲得的是HtmlElement對象,所以如果想通過迭代獲得PyQuery對象,則需要使用PyQuery對象的items()方法,示例代碼如下:

4)修改節點

可以通過PyQuery對節點進行動態修改,為在某些特定的場景下獲取節點信息帶來極大的便利。

(1)刪除節點,可以通過PyQuery對象的remove()方法刪除節點,其語法格式如下:

     remove(expr)

其中,參數expr為可選參數,表示節點選擇器或jQuery選擇器,默認表示無條件,示例代碼如下:

(2)添加節點,可以通過PyQuery對象的prepend()方法或append()方法分別在頭部或尾部添加節點,其語法格式分別如下:

     prepend(value)

其中,參數value表示HTML字符串。

     append(value)

其中,參數value表示HTML字符串。

示例代碼如下:

(3)修改節點屬性,可以通過PyQuery對象的attr()方法修改節點屬性,其語法格式如下:

     attr(attr,value)

其中,參數attr表示屬性名稱;參數value表示屬性值,示例代碼如下:

(4)刪除節點屬性,可以通過PyQuery對象的remove_attr()方法刪除節點屬性,其語法格式如下:

     remove_attr(name)

其中,參數name表示屬性名稱,示例代碼如下:

(5)修改節點文本內容,可以通過PyQuery對象的text()方法或html()方法修改節點的文本內容,其語法格式分別如下:

     text(value)

其中,參數value表示文本內容。

     html(value)

其中,參數value表示文本內容。

示例代碼如下:

(6)添加節點樣式,可以通過PyQuery對象的add_class()方法添加節點樣式,其語法格式如下:

     add_class(value)

其中,參數value表示屬性class的屬性值,示例代碼如下:

(7)刪除節點樣式,可以通過PyQuery對象的remove_class()方法刪除節點樣式,其語法格式如下:

     remove_class(value)

其中,參數value表示屬性class的屬性值,示例代碼如下:

主站蜘蛛池模板: 呈贡县| 张北县| 安仁县| 石泉县| 宝清县| 武胜县| 开阳县| 刚察县| 法库县| 大关县| 桦南县| 阿图什市| 崇义县| 威海市| 玉树县| 石台县| 那曲县| 盐津县| 文昌市| 武冈市| 云霄县| 玛多县| 左云县| 仁布县| 辽阳市| 雅安市| 卓尼县| 宁武县| 东阳市| 新沂市| 云林县| 贡嘎县| 抚顺县| 永福县| 新竹市| 新绛县| 新兴县| 舞阳县| 灌阳县| 揭阳市| 买车|