1. 程式人生 > >這是我見過最牛逼,最全面的Beautiful Soup 4.2 教程!沒有之一

這是我見過最牛逼,最全面的Beautiful Soup 4.2 教程!沒有之一

進群:125240963    即可獲取數十套PDF

Beautiful Soup 是一個可以從HTML或XML檔案中提取資料的Python庫.它能夠通過你喜歡的轉換器實現慣用的文件導航,查詢,修改文件的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間.

這篇文件介紹了BeautifulSoup4中所有主要特性,並且有小例子.讓我來向你展示它適合做什麼,如何工作,怎樣使用,如何達到你想要的效果,和處理異常情況.

文件中出現的例子在Python2.7和Python3.2中的執行結果相同

你可能在尋找 Beautiful Soup3 的文件,Beautiful Soup 3 目前已經停止開發,我們推薦在現在的專案中使用Beautiful Soup 4, 移植到BS4

尋求幫助

如果你有關於BeautifulSoup的問題,可以傳送郵件到 討論組 .如果你的問題包含了一段需要轉換的HTML程式碼,那麼確保你提的問題描述中附帶這段HTML文件的 程式碼診斷 [1]

快速開始

下面的一段HTML程式碼將作為例子被多次用到.這是 愛麗絲夢遊仙境的 的一段內容(以後內容中簡稱為 愛麗絲 的文件):

html_doc = """

<html><head><title>The Dormouse's story</title></head>

<body>

<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were

<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,

<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and

<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;

and they lived at the bottom of a well.</p>

<p class="story">...</p>

"""

使用BeautifulSoup解析這段程式碼,能夠得到一個 BeautifulSoup 的物件,並能按照標準的縮排格式的結構輸出:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_doc)

print(soup.prettify())

# <html>

# <head>

# <title>

# The Dormouse's story

# </title>

# </head>

# <body>

# <p class="title">

# <b>

# The Dormouse's story

# </b>

# </p>

# <p class="story">

# Once upon a time there were three little sisters; and their names were

# <a class="sister" href="http://example.com/elsie" id="link1">

# Elsie

# </a>

# ,

# <a class="sister" href="http://example.com/lacie" id="link2">

# Lacie

# </a>

# and

# <a class="sister" href="http://example.com/tillie" id="link2">

# Tillie

# </a>

# ; and they lived at the bottom of a well.

# </p>

# <p class="story">

# ...

# </p>

# </body>

# </html>

幾個簡單的瀏覽結構化資料的方法:

soup.title

# <title>The Dormouse's story</title>

soup.title.name

# u'title'

soup.title.string

# u'The Dormouse's story'

soup.title.parent.name

# u'head'

soup.p

# <p class="title"><b>The Dormouse's story</b></p>

soup.p['class']

# u'title'

soup.a

# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

soup.find_all('a')

# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,

# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,

# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

soup.find(id="link3")

# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

從文件中找到所有<a>標籤的連結:

for link in soup.find_all('a'):

print(link.get('href'))

# http://example.com/elsie

# http://example.com/lacie

# http://example.com/tillie

從文件中獲取所有文字內容:

print(soup.get_text())

# The Dormouse's story

#

# The Dormouse's story

#

# Once upon a time there were three little sisters; and their names were

# Elsie,

# Lacie and

# Tillie;

# and they lived at the bottom of a well.

#

# ...

這是你想要的嗎?彆著急,還有更好用的

安裝 Beautiful Soup

如果你用的是新版的Debain或ubuntu,那麼可以通過系統的軟體包管理來安裝:

$ apt-get install Python-bs4

Beautiful Soup 4 通過PyPi釋出,所以如果你無法使用系統包管理安裝,那麼也可以通過 easy_install 或 pip 來安裝.包的名字是 beautifulsoup4 ,這個包相容Python2和Python3.

$ easy_install beautifulsoup4

$ pip install beautifulsoup4

(在PyPi中還有一個名字是 BeautifulSoup 的包,但那可能不是你想要的,那是 Beautiful Soup3 的釋出版本,因為很多專案還在使用BS3, 所以 BeautifulSoup 包依然有效.但是如果你在編寫新專案,那麼你應該安裝的beautifulsoup4 )

如果你沒有安裝 easy_install 或 pip ,那你也可以 下載BS4的原始碼 ,然後通過setup.py來安裝.

$ Python setup.py install

如果上述安裝方法都行不通,Beautiful Soup的釋出協議允許你將BS4的程式碼打包在你的專案中,這樣無須安裝即可使用.

作者在Python2.7和Python3.2的版本下開發Beautiful Soup, 理論上Beautiful Soup應該在所有當前的Python版本中正常工作

安裝完成後的問題

Beautiful Soup釋出時打包成Python2版本的程式碼,在Python3環境下安裝時,會自動轉換成Python3的程式碼,如果沒有一個安裝的過程,那麼程式碼就不會被轉換.

如果程式碼丟擲了 ImportError 的異常: “No module named HTMLParser”, 這是因為你在Python3版本中執行Python2版本的程式碼.

如果程式碼丟擲了 ImportError 的異常: “No module named html.parser”, 這是因為你在Python2版本中執行Python3版本的程式碼.

如果遇到上述2種情況,最好的解決方法是重新安裝BeautifulSoup4.

如果在ROOT_TAG_NAME = u’[document]’程式碼處遇到 SyntaxError “Invalid syntax”錯誤,需要將把BS4的Python程式碼版本從Python2轉換到Python3. 可以重新安裝BS4:

$ Python3 setup.py install

或在bs4的目錄中執行Python程式碼版本轉換指令碼

$ 2to3-3.2 -w bs4

安裝解析器

Beautiful Soup支援Python標準庫中的HTML解析器,還支援一些第三方的解析器,其中一個是 lxml .根據作業系統不同,可以選擇下列方法來安裝lxml:

$ apt-get install Python-lxml

$ easy_install lxml

$ pip install lxml

另一個可供選擇的解析器是純Python實現的 html5lib , html5lib的解析方式與瀏覽器相同,可以選擇下列方法來安裝html5lib:

$ apt-get install Python-html5lib

$ easy_install html5lib

$ pip install html5lib

下表列出了主要的解析器,以及它們的優缺點:

  • 解析器使用方法優勢劣勢Python標準庫BeautifulSoup(markup, "html.parser")Python的內建標準庫
  • 執行速度適中
  • 文件容錯能力強
  • Python 2.7.3 or 3.2.2)前 的版本中文件容錯能力差
  • lxml HTML 解析器BeautifulSoup(markup, "lxml")速度快
  • 文件容錯能力強
  • 需要安裝C語言庫

lxml XML 解析器BeautifulSoup(markup, ["lxml", "xml"])

BeautifulSoup(markup, "xml")

  • 速度快
  • 唯一支援XML的解析器
  • 需要安裝C語言庫
  • html5libBeautifulSoup(markup, "html5lib")最好的容錯性
  • 以瀏覽器的方式解析文件
  • 生成HTML5格式的文件
  • 速度慢
  • 不依賴外部擴充套件

推薦使用lxml作為解析器,因為效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必須安裝lxml或html5lib, 因為那些Python版本的標準庫中內建的HTML解析方法不夠穩定.

提示: 如果一段HTML或XML文件格式不正確的話,那麼在不同的解析器中返回的結果可能是不一樣的,檢視 解析器之間的區別 瞭解更多細節

如何使用

將一段文件傳入BeautifulSoup 的構造方法,就能得到一個文件的物件, 可以傳入一段字串或一個檔案控制代碼.

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("index.html"))

soup = BeautifulSoup("<html>data</html>")

首先,文件被轉換成Unicode,並且HTML的例項都被轉換成Unicode編碼

BeautifulSoup("Sacré bleu!")

<html><head></head><body>Sacré bleu!</body></html>

然後,Beautiful Soup選擇最合適的解析器來解析這段文件,如果手動指定解析器那麼Beautiful Soup會選擇指定的解析器來解析文件.(參考 解析成XML ).

物件的種類

Beautiful Soup將複雜HTML文件轉換成一個複雜的樹形結構,每個節點都是Python物件,所有物件可以歸納為4種: Tag , NavigableString , BeautifulSoup , Comment .

Tag

Tag 物件與XML或HTML原生文件中的tag相同:

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')

tag = soup.b

type(tag)

# <class 'bs4.element.Tag'>

Tag有很多方法和屬性,在 遍歷文件樹 和 搜尋文件樹 中有詳細解釋.現在介紹一下tag中最重要的屬性: name和attributes

Name

每個tag都有自己的名字,通過 .name 來獲取:

tag.name

# u'b'

如果改變了tag的name,那將影響所有通過當前Beautiful Soup物件生成的HTML文件:

tag.name = "blockquote"

tag

# <blockquote class="boldest">Extremely bold</blockquote>

Attributes

一個tag可能有很多個屬性. tag <b class="boldest"> 有一個 “class” 的屬性,值為 “boldest” . tag的屬性的操作方法與字典相同:

tag['class']

# u'boldest'

也可以直接”點”取屬性, 比如: .attrs :

tag.attrs

# {u'class': u'boldest'}

tag的屬性可以被新增,刪除或修改. 再說一次, tag的屬性操作方法與字典一樣

tag['class'] = 'verybold'

tag['id'] = 1

tag

# <blockquote class="verybold" id="1">Extremely bold</blockquote>

del tag['class']

del tag['id']

tag

# <blockquote>Extremely bold</blockquote>

tag['class']

# KeyError: 'class'

print(tag.get('class'))

# None

多值屬性

HTML 4定義了一系列可以包含多個值的屬性.在HTML5中移除了一些,卻增加更多.最常見的多值的屬性是 class (一個tag可以有多個CSS的class). 還有一些屬性 rel , rev , accept-charset , headers , accesskey . 在Beautiful Soup中多值屬性的返回型別是list:

css_soup = BeautifulSoup('<p class="body strikeout"></p>')

css_soup.p['class']

# ["body", "strikeout"]

css_soup = BeautifulSoup('<p class="body"></p>')

css_soup.p['class']

# ["body"]

如果某個屬性看起來好像有多個值,但在任何版本的HTML定義中都沒有被定義為多值屬性,那麼Beautiful Soup會將這個屬性作為字串返回

id_soup = BeautifulSoup('<p id="my id"></p>')

id_soup.p['id']

# 'my id'

將tag轉換成字串時,多值屬性會合併為一個值

rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')

rel_soup.a['rel']

# ['index']

rel_soup.a['rel'] = ['index', 'contents']

print(rel_soup.p)

# <p>Back to the <a rel="index contents">homepage</a></p>

如果轉換的文件是XML格式,那麼tag中不包含多值屬性

xml_soup = BeautifulSoup('<p class="body strikeout"></p>', 'xml')

xml_soup.p['class']

# u'body strikeout'

可以遍歷的字串

字串常被包含在tag內.Beautiful Soup用 NavigableString 類來包裝tag中的字串:

tag.string

# u'Extremely bold'

type(tag.string)

# <class 'bs4.element.NavigableString'>

一個 NavigableString 字串與Python中的Unicode字串相同,並且還支援包含在 遍歷文件樹 和 搜尋文件樹 中的一些特性. 通過 unicode() 方法可以直接將 NavigableString 物件轉換成Unicode字串:

unicode_string = unicode(tag.string)

unicode_string

# u'Extremely bold'

type(unicode_string)

# <type 'unicode'>

tag中包含的字串不能編輯,但是可以被替換成其它的字串,用 replace_with() 方法:

tag.string.replace_with("No longer bold")

tag

# <blockquote>No longer bold</blockquote>

NavigableString 物件支援 遍歷文件樹 和 搜尋文件樹 中定義的大部分屬性, 並非全部.尤其是,一個字串不能包含其它內容(tag能夠包含字串或是其它tag),字串不支援 .contents 或 .string 屬性或 find() 方法.

如果想在Beautiful Soup之外使用 NavigableString 物件,需要呼叫 unicode() 方法,將該物件轉換成普通的Unicode字串,否則就算Beautiful Soup已方法已經執行結束,該物件的輸出也會帶有物件的引用地址.這樣會浪費記憶體.

BeautifulSoup

BeautifulSoup 物件表示的是一個文件的全部內容.大部分時候,可以把它當作 Tag 物件,它支援 遍歷文件樹 和 搜尋文件樹 中描述的大部分的方法.

因為 BeautifulSoup 物件並不是真正的HTML或XML的tag,所以它沒有name和attribute屬性.但有時檢視它的 .name 屬性是很方便的,所以 BeautifulSoup 物件包含了一個值為 “[document]” 的特殊屬性 .name

soup.name

# u'[document]'

註釋及特殊字串

Tag , NavigableString , BeautifulSoup 幾乎覆蓋了html和xml中的所有內容,但是還有一些特殊物件.容易讓人擔心的內容是文件的註釋部分:

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"

soup = BeautifulSoup(markup)

comment = soup.b.string

type(comment)

# <class 'bs4.element.Comment'>

Comment 物件是一個特殊型別的 NavigableString 物件:

comment

# u'Hey, buddy. Want to buy a used parser'

但是當它出現在HTML文件中時, Comment 物件會使用特殊的格式輸出:

print(soup.b.prettify())

# <b>

# <!--Hey, buddy. Want to buy a used parser?-->

# </b>

Beautiful Soup中定義的其它型別都可能會出現在XML的文件中: CData , ProcessingInstruction , Declaration , Doctype .與 Comment 物件類似,這些類都是 NavigableString 的子類,只是添加了一些額外的方法的字串獨享.下面是用CDATA來替代註釋的例子:

from bs4 import CData

cdata = CData("A CDATA block")

comment.replace_with(cdata)

print(soup.b.prettify())

# <b>

# <![CDATA[A CDATA block]]>

# </b>

遍歷文件樹

還拿”愛麗絲夢遊仙境”的文件來做例子:

html_doc = """

<html><head><title>The Dormouse's story</title></head>

<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were

相關推薦

我見全面的Beautiful Soup 4.2 教程沒有之一

進群:125240963    即可獲取數十套PDF!Beautiful Soup 是一個可以從HTML或XML檔案中提取資料的Python庫.它能夠通過你喜歡的轉換器實現慣用的文件導航,查詢,修改文件的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間.這

詳細的大資料之Hadoop分散式系統架構解析沒有之一

Hadoop 由許多元素構成。其最底部是 Hadoop Distributed File System(HDFS),它儲存 Hadoop 叢集中所有儲存節點上的檔案。HDFS(對於本文)的上一層是MapReduce引擎,該引擎由 JobTrackers 和 TaskTrack

全面的Pandas的教程沒有之一!

缺少 輕松 範圍 esc image 標準 view multi scribe Pandas?是基於?NumPy?的一個開源 Python 庫,它被廣泛用於快速分析數據,以及數據清洗和準備等工作。它的名字來源是由“ Panel data”(面板數據,一個計量經濟學名詞)兩個

Win764位Python使用Beautiful Soup 4抓取網易雲音樂歌單中的歌曲

使用Beautiful soup 4抓取網易雲音樂歌單(http://music.163.com/#/playlist?id=569020058)中的歌曲 安裝Beautiful soup 4成功後,可以像下面這樣匯入Beautiful soup 4模組: >

是迄今為止我見的程式設計師堪稱程式碼之王

今天逛論壇看到了一位程式設計師大佬,真的是大佬,寫了一個街頭霸王遊戲,我很早學JavaScript的時候自己也想過寫遊戲,但是那時候思維技術什麼都不是很到位,所以一直沒有去寫,現在也沒有那個閒情去寫這個了,當然對於剛學好JavaScript的確是是一個鍛鍊思維和技術的最好

你見的程式設計師是什麼樣的?拳打回車鍵腳踩Emacs編輯器

我自己是一名大資料架構師,目前辭職在做線上教育大資料講師,每天都會直播分享免費公開課,大家可以加群參加。以及我自己整理了一套最新的大資料學習系統教程,包括Hadoop,資料探勘,資料分析。送給正在學習大資料的小夥伴!這裡是大資料學習者聚集地,歡迎初學和進階中的小夥伴!加QQ群:5849001

八個爬蟲框架是目前你用哪幾個呢?

小編收集了一些較為高效的Python爬蟲框架。分享給大家。 1.Scrapy Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 可以應用在包括資料探勘,資訊處理或儲存歷史資料等一系列的程式中。。用這個框架可以輕鬆爬下來如亞馬遜商品資訊之類的資料。  

年底了程式設計師來說說你今年寫的bug是什麼?

很久之前就有一個關於程式設計師的梗:“喲!又在寫 Bug 呢?” 據說這是對程式設計師殺傷力最大的一句話,沒有之一!之所以如此,那是因為這是句大實話啊!是的,程式設計師的人生就是Bug和Debug交織在一起的悲歌。 那!年底了,程式設計師們,來說說你今年寫過的最牛逼的bug是什麼?

拼多多小程式13拉新裂變的增長套路就在裡面

作者:王六六 幾個關鍵字:電商、拼團、自傳播、失效性(緊迫感)、誘導、不想損失、微信小程式、App。 1、開紅包領現金 活動標題:好友幫開,你領現金——小程式 玩法規則: 進入小程式,平臺贈送1個紅包,領取後,立即提示邀請好友幫忙拆,紅包總額沒有上線,邀請好友越多,獲得金額越多

8個程式設計師專用軟體/網站個個是神器第一個

節省時間的方法有倆,一個是放棄做一些事,在做一些事的時候同步做另一些事。另一種就是改進做一些事的效率,更快地做一些事。尋找更加高效、好用的工具所花費的時間,和這些工具將為你節省的時間相比,九牛一毛。 今天給大家推薦幾個程式設計師專用的小工具/網站,希望能夠改善你的工作效率和心情。如此,足矣!

史上的純CSS實現tab選項卡閃瞎你的狗眼

                     html檔案<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title>CSS3外觀漂亮淡入淡出Tab選單演示<

的程式碼簡潔的描述歡迎PK

   摘要 剛剛完成一篇利用位運算高效地、巧妙地來解決求組合的博文:《非常給力:位運算求組合》。巧合的是,我在《資料結構演算法與應用》一書中看到一道課後題是:用遞迴實現求一個集合的所有子集。受到題目的要求,我開始想遞迴,想著想著,我就發現此題不用遞迴而用位運算來求解,仍然非常巧妙!本篇,我將講解如何利用位運

Pycharm是的編輯器小白如何快速上手?完整的教程

進群:125240963  即可獲取Pycharm這款編輯器的安裝包。以及視訊教程哦!#0. PyCharm 常用快捷鍵macwin#1.檢視使用庫原始碼PyCharm 主程式設計師在 Stackoverflow 上答道經常聽人說,多看原始碼。原始碼不僅能幫我們搞清楚執行機制

史上編程的9位程序員你心中的No.1是誰?

貝爾 follow 面向 block asm 實驗室 unix 演講家 pytho 今天為大家介紹的這九位是對整個編程史影響甚遠的程序員,他們每一個都在編程史上留下了自己的痕跡,他們要麽是一些技術大神,要麽是編程語言創始人,那麽在編輯名人堂裏,最厲害最牛掰的程序員會是誰呢?

怎麼看《就算老公一毛錢股份都沒拿到在我心裡他依然是的創業者》文中創業公司 CEO 的行為?

這公司ceo真是渣到底,公司也曝光下:北京展程科技有限公司成立於2010年,創立初期就獲得李開復“創新工場”的投資。公司成立僅僅4年已成為行業內盈利較高、發展較快的企業之一,同時也成為國內最具潛力的手機遊戲研發與運營企業。從昔日的三人團隊成長為如今近兩百人戰隊,

全球的 14 位程序員大佬請收下我的膝蓋~

進行 lac part opc 代表作 分布式計算 原形 dennis 程序語言 全球最厲害的14位程序員是誰,你知道的有幾位呢? 以下排名不分先後: Jon Skeet 個人名望:程序技術問答網站Stack Overflow總排名第一的大神,每月的問答量保持在425個

Linux上安裝python3.6 並創建虛擬環境 -----的方法

versions pack 環境 windows png linux red hat new highlight ...安裝IUS,IUS provides Red Hat Package Manager(RPM) packages for some newer versi

Python學習筆記 - 的內建函數max和min

python學習 blog 叠代器 判斷 splay ont pan 序列 最大值 本文主要介紹了max的運行機制,以及如何傳入和比較,min函數的運行機制和max一樣,只是min取的是最小值 max/min 後直接跟序列會返回此序列的最大/最小值 max(iterab

全球黑客的另一面人生:懂黑客更懂金融

投資 info 的確 發布 技術分享 國情 忽略 安全技術 數據   俗話說,不怕黑客有技術,最怕黑客懂金融。從中國互聯網誕生以來,我們會發現很多黑客安全聯盟一般活不到三年,甚至幾個月;那麽到底是什麽原因?很簡單,缺錢。但提起東方聯盟,我們相信大家都熟悉,從2007年開始,

爬蟲工程師的地方是什麽???

反爬蟲 span str 什麽 每天 程序 情況 spa 多少 爬蟲工程師最牛逼的地方是什麽??? 爬蟲工程師最牛逼的地方是什麽??? 爬蟲工程師最牛逼的地方是什麽??? 今天突然想到了這個問題,是因為解決工作的時候,突然想到了這個問題,我的答案是: 爬