Python爬蟲網頁元素定位術

實戰場景

初學 Python 爬蟲,十之八九大傢采集的目標是網頁,因此快速定位到網頁內容,就成為我們面臨的第一道障礙,本篇博客就為你詳細說明最易上手的網頁元素定位術,學完就會系列。

本文核心使用到的是 Beautiful Soup 模塊,因此我們用來做測試采集的站點,也是其官網(現階段爬蟲采集越來越嚴格,很多站點不能在采集瞭,很容易被封殺,隻能學誰就采集誰瞭)

官方站點:

www.crummy.com/software/BeautifulSoup/

Beautiful Soup 在 Python 爬蟲圈知名度極高,而且非常好用,它是一款 Python 解析庫,主要用於將 HTML 標簽轉換為 Python 對象樹,然後讓我們從對象樹中提取數據。

模塊的安裝及其簡單:

pip install bs4 -i 國內任意源即可

未來安裝任何模塊,都盡量使用國內源,速度快穩定。

該模塊包名稱為 bs4,安裝的時候需要特別註意下。

基礎用法如下所示

import requests
from bs4 import BeautifulSoup
def ret_html():
    """獲取HTML元素"""
    res = requests.get('https://www.crummy.com/software/BeautifulSoup/', timeout=3)
    return res.text
if __name__ == '__main__':
    html_str = ret_html()
    soup = BeautifulSoup(html_str, 'lxml')
    print(soup)

其中需要註意的就是模塊導入代碼,以及實例化 soup 對象時,在 BeautifulSoup 類的構造函數中傳遞的兩個參數,一個是待解析的字符串,另一個是解析器,官方建議的是 lxml,因其解析速度快。

上述代碼輸出的內容如下所示,看上去就是普通的 HTML 代碼文件。

而且我們可以調用 soup 對象的 soup.prettify() 方法,可以將 HTML 標簽進行格式化操作,這樣你就可以在存儲到外部文件的時候,讓其 HTML 代碼進行美觀。

BeautifulSoup 模塊的對象說明

BeautifulSoup 類可以將 HTML 文本解析成 Python 對象樹,而這裡面又包括最重要的四種對象,分別是 TagNavigableStringBeautifulSoupComment 對象,接下來我們一一介紹。

BeautifulSoup 對象

該對象本身就代表整個 HTML 頁面,而且實例化該對象的時候,還會自動補齊 HTML 代碼。

    html_str = ret_html()
    soup = BeautifulSoup(html_str, 'lxml')
    print(type(soup))

Tag 對象

Tag 是標簽的意思,Tag 對象就是網頁標簽,或者叫做網頁元素對象,例如獲取 bs4 官網的 h1 標簽對象,代碼如下所示:

if __name__ == '__main__':
    html_str = ret_html()
    soup = BeautifulSoup(html_str, 'lxml')
    # print(soup.prettify())  # 格式化 HTML
    print(soup.h1)

得到的也是網頁中的 h1 標簽:

<h1>Beautiful Soup</h1>

用 Python 中的 type 函數,可以查看其類型,代碼如下:

    print(soup.h1)
    print(type(soup.h1))

此時得到的可不是一個字符串,而是一個 Tag 對象。

<h1>Beautiful Soup</h1>
<class 'bs4.element.Tag'>

既然是 Tag 對象,那就會具備一些特定的屬性值

獲取標簽名稱

    print(soup.h1)
    print(type(soup.h1))
    print(soup.h1.name)  # 獲取標簽名稱

通過 Tag 對象獲取標簽的屬性值

 print(soup.img)  # 獲取網頁第一個 img 標簽
 print(soup.img['src'])  # 獲取網頁元素DOM的屬性值

通過 attrs 屬性獲取標簽的所有屬性

print(soup.img)  # 獲取網頁第一個 img 標簽
print(soup.img.attrs)  # 獲取網頁元素的所有屬性值,以字典形式返回

以上代碼的所有輸出如下所示,可以任意選擇標簽進行練習。

<h1>Beautiful Soup</h1>
<class 'bs4.element.Tag'>
h1
<img align="right" src="10.1.jpg" width="250"/>
{'align': 'right', 'src': '10.1.jpg', 'width': '250'}

NavigableString 對象

NavigableString 對象獲取的是標簽內部的文字內容,例如p標簽,在下述代碼中提取的是我是橡皮擦

<p>我是橡皮擦</p>

獲取該對象也非常容易,使用 Tag 對象的 string 屬性即可。

    nav_obj = soup.h1.string
    print(type(nav_obj))

輸出結果如下所示:

<class 'bs4.element.NavigableString'>

如果目標標簽是一個單標簽,會獲取到 None 數據

除瞭使用對象的string方法外,還可以使用text屬性和get_text()方法來獲取標簽內容

    print(soup.h1.text)
    print(soup.p.get_text())
    print(soup.p.get_text('&'))

其中 text是獲取所有子標簽內容的合並字符串,而get_text()也是相同的效果,不過使用get_text()可以增加一個分隔符,例如上述代碼的&符號,還可以使用,strip=True 參數去除空格。

Comment 對象

BeautifulSoup 對象和 Tag 對象支持標簽查找方法,具體內容如下所示。

find() 方法和 find_all() 方法

調用 BeautifulSoup 對象和 Tag 對象的find()方法,可以在網頁中找到指定對象,

該方法的語法格式如下:

obj.find(name,attrs,recursive,text,**kws)

方法的返回結果是查找到的第一個元素,如果沒查詢到,返回 None。 參數說明如下:

  • name:標簽名稱;
  • attrs:標簽屬性;
  • recursive:默認搜索所有後代元素;
  • text:標簽內容。

例如我們繼續在上文請求的網頁中,查找a標簽,代碼如下:

html_str = ret_html()
soup = BeautifulSoup(html_str, 'lxml')
print(soup.find('a'))

也可以使用attrs參數進行查找,代碼如下:

html_str = ret_html()
soup = BeautifulSoup(html_str, 'lxml')
# print(soup.find('a'))
print(soup.find(attrs={'class': 'cta'}))

find()方法還提供瞭一些特殊的參數,便於直接查找,例如可以使用id=xxx,查找屬性中包含 id的標簽,可以使用class_=xxx,查找屬性中包含class的標簽。

print(soup.find(class_='cta'))

find()方法成對出現的是find_all()方法,看名稱就能知道其返回結果收是全部匹配標簽,語法格式如下:

obj.find_all(name,attrs,recursive,text,limit)

其中重點說明一下limit參數,它表示最多返回的匹配數量,find()方法可以看作limit=1,這樣就變得容易理解瞭。

到此這篇關於Python爬蟲網頁元素定位術的文章就介紹到這瞭,更多相關Python元素定位內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: