溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Beautiful Soup庫(kù)的使用方法

發(fā)布時(shí)間:2020-08-05 15:36:27 來(lái)源:億速云 閱讀:175 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下Beautiful Soup庫(kù)的使用方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

Beautiful Soup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫(kù)。它能夠通過(guò)你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航,查找,修改文檔的方式。Beautiful Soup 會(huì)幫你節(jié)省數(shù)小時(shí)甚至數(shù)天的工作時(shí)間。

1. 安裝

以下都是在 python2.7 中進(jìn)行測(cè)試的。

可以直接使用 pip 安裝:

$ pip install beautifulsoup4

BeautifulSoup 不僅支持 HTML 解析器,還支持一些第三方的解析器,如,lxml,XML,html5lib 但是需要安裝相應(yīng)的庫(kù)。

$ pip install lxml
$ pip install html5lib

2. 開(kāi)始使用

Beautiful Soup 的功能相當(dāng)強(qiáng)大,但我們只介紹經(jīng)常使用的功能。

簡(jiǎn)單用法

將一段文檔傳入 BeautifulSoup 的構(gòu)造方法,就能得到一個(gè)文檔的對(duì)象, 可以傳入一段字符串或一個(gè)文件句柄。

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<html><body><p>data</p></body></html>")
>>> soup
<html><body><p>data</p></body></html>
>>> soup('p')
[<p>data</p>]

首先傳入一個(gè) html 文檔,soup 是獲得文檔的對(duì)象。然后,文檔被轉(zhuǎn)換成 Unicode ,并且 HTML 的實(shí)例都被轉(zhuǎn)換成 Unicode 編碼。然后,Beautiful Soup 選擇最合適的解析器來(lái)解析這段文檔,如果手動(dòng)指定解析器那么 Beautiful Soup 會(huì)選擇指定的解析器來(lái)解析文檔。但是一般最好手動(dòng)指定解析器,并且使用 requests 與 BeautifulSoup 結(jié)合使用, requests 是用于爬取網(wǎng)頁(yè)源碼的一個(gè)庫(kù),此處不再介紹,requests 更多用法請(qǐng)參考  Requests 2.10.0 文檔 。

要解析的文檔是什么類型: 目前支持, html, xml, 和 html5

指定使用哪種解析器: 目前支持, lxml, html5lib, 和 html.parser

from bs4 import BeautifulSoup
import requests
html = requests.get(‘http://www.jianshu.com/’).content  
soup = BeautifulSoup(html, 'html.parser', from_encoding='utf-8')
result = soup('div')

對(duì)象的種類

Beautiful Soup 將復(fù)雜 HTML 文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是 Python 對(duì)象,所有對(duì)象可以歸納為 4 種: Tag , NavigableString , BeautifulSoup , Comment。

Tag:通俗點(diǎn)講就是 HTML 中的一個(gè)個(gè)標(biāo)簽,像上面的 div,p。每個(gè) Tag 有兩個(gè)重要的屬性 name 和 attrs,name 指標(biāo)簽的名字或者 tag 本身的 name,attrs 通常指一個(gè)標(biāo)簽的 class。

NavigableString:獲取標(biāo)簽內(nèi)部的文字,如,soup.p.string。

BeautifulSoup:表示一個(gè)文檔的全部?jī)?nèi)容。

Comment:Comment 對(duì)象是一個(gè)特殊類型的 NavigableString 對(duì)象,其輸出的內(nèi)容不包括注釋符號(hào)。

示例

下面是一個(gè)示例,帶你了解 Beautiful Soup 的常見(jiàn)用法:

import sys  
reload(sys)  
sys.setdefaultencoding('utf-8') 
from bs4 import BeautifulSoup
import requests
html_doc = """
<head>
      <meta charset="utf-8">
      <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <title>首頁(yè) - 簡(jiǎn)書</title>
</head>
<body class="output fluid zh cn win reader-day-mode reader-font2 " data-js-module="recommendation" data-locale="zh-CN">
<ul class="article-list thumbnails">
  <li class=have-img>
      <a class="wrap-img" href="/p/49c4728c3ab2"><img src="http://upload-images.jianshu.io/upload_images
      /2442470-745c6471c6f8258c.jpg?imageMogr2/auto-orient/strip%7CimageView2/1/w/300/h/300" alt="300" /></a>
    <div>
      <p class="list-top">
        <a class="author-name blue-link" target="_blank" href="/users/0af6b163b687">阿隨向前沖</a>
        <em>·</em>
        <span class="time" data-shared-at="2016-07-27T07:03:54+08:00"></span>
      </p>
      <h5 class="title"><a target="_blank" href="/p/49c4728c3ab2"> 只裝了這六款軟件,
      工作就高效到有時(shí)間逛某寶刷某圈</a></h5>
      <div class="list-footer">
        <a target="_blank" href="/p/49c4728c3ab2">
          閱讀 1830
</a>        <a target="_blank" href="/p/49c4728c3ab2#comments">
           · 評(píng)論 35
</a>        <span> · 喜歡 95</span>
          <span> · 打賞 1</span>
        
      </div>
    </div>
  </li>
</ul>
</body>
"""
soup = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8')
# 查找所有有關(guān)的節(jié)點(diǎn)
tags = soup.find_all('li', class_="have-img")
for tag in tags:
        image = tag.img['src']
        article_user = tag.p.a.get_text()
        article_user_url = tag.p.a['href']      
        created = tag.p.span['data-shared-at']        
        article_url = tag.h5.a['href']
        # 可以在查找的 tag 下繼續(xù)使用 find_all()
        tag_span = tag.div.div.find_all('span')
        likes = tag_span[0].get_text(strip=True)

BeautifulSoup 主要用來(lái)遍歷子節(jié)點(diǎn)及子節(jié)點(diǎn)的屬性,通過(guò)點(diǎn)取屬性的方式只能獲得當(dāng)前文檔中的第一個(gè) tag,例如,soup.li。如果想要得到所有的<li> 標(biāo)簽,或是通過(guò)名字得到比一個(gè) tag 更多的內(nèi)容的時(shí)候,就需要用到 find_all(),find_all() 方法搜索當(dāng)前 tag 的所有 tag 子節(jié)點(diǎn),并判斷是否符合過(guò)濾器的條件find_all() 所接受的參數(shù)如下:

find_all( name , attrs , recursive , string , **kwargs )

按 name 搜索: name 參數(shù)可以查找所有名字為 name 的 tag,字符串對(duì)象會(huì)被自動(dòng)忽略掉:

soup.find_all("li")

按 id 搜索: 如果包含一個(gè)名字為 id 的參數(shù),搜索時(shí)會(huì)把該參數(shù)當(dāng)作指定名字 tag 的屬性來(lái)搜索:

soup.find_all(id='link2')

按 attr 搜索:有些 tag 屬性在搜索不能使用,比如 HTML5 中的 data-* 屬性,但是可以通過(guò) find_all() 方法的 attrs 參數(shù)定義一個(gè)字典參數(shù)來(lái)搜索包含特殊屬性的 tag:

data_soup.find_all(attrs={"data-foo": "value"})

按 CSS 搜索: 按照 CSS 類名搜索 tag 的功能非常實(shí)用,但標(biāo)識(shí)CSS 類名的關(guān)鍵字 class 在 Python 中是保留字,使用 class 做參數(shù)會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤.從 Beautiful Soup 的 4.1.1 版本開(kāi)始,可以通過(guò) class_ 參數(shù)搜索有指定 CSS 類名的 tag:

soup.find_all('li', class_="have-img")

string 參數(shù):通過(guò) string 參數(shù)可以搜搜文檔中的字符串內(nèi)容.與 name 參數(shù)的可選值一樣, string 參數(shù)接受 字符串 , 正則表達(dá)式 , 列表, True 。 看例子:

soup.find_all("a", string="Elsie")

recursive 參數(shù):調(diào)用 tag 的 find_all() 方法時(shí),Beautiful Soup 會(huì)檢索當(dāng)前 tag 的所有子孫節(jié)點(diǎn),如果只想搜索 tag 的直接子節(jié)點(diǎn),可以使用參數(shù) recursive=False .

soup.find_all("title", recursive=False)

find_all() 幾乎是 Beautiful Soup中最常用的搜索方法,也可以使用其簡(jiǎn)寫方法,以下代碼等價(jià):

  soup.find_all("a")
    soup("a")
get_text()

如果只想得到 tag 中包含的文本內(nèi)容,那么可以用 get_text() 方法,這個(gè)方法獲取到 tag 中包含的所有文版內(nèi)容包括子孫 tag 中的內(nèi)容,并將結(jié)果作為 Unicode 字符串返回:

tag.p.a.get_text()

看完了這篇文章,相信你對(duì)Beautiful Soup庫(kù)的使用方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI