這是我見過最牛逼,最全面的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”(面板數據,一個計量經濟學名詞)兩個
Win7,64位,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 多少 爬蟲工程師最牛逼的地方是什麽??? 爬蟲工程師最牛逼的地方是什麽??? 爬蟲工程師最牛逼的地方是什麽??? 今天突然想到了這個問題,是因為解決工作的時候,突然想到了這個問題,我的答案是: 爬