我們先前進行網(wǎng)站頁面內(nèi)容解析的過程中,通常選擇運用正則表達式來完成此任務。然而,正如前面幾篇文章所闡述和分析的那樣,無論是正則表達式還是XPath,它們雖各自具備適應不同應用場景的優(yōu)勢,卻也都存在著各自難以避免的缺陷。例如,正則表達式具有相對復雜的語法結構并且需要大量的編程知識才能熟練掌握;而XPath雖然使得實現(xiàn)路徑查找更為簡潔易懂,但卻需要編寫復雜的節(jié)點路徑編碼。因此,為了充分利用HTML讀取技術的強大功能,同時追求更加簡明直觀的操作體驗,本文將向您推薦Beautiful Soup這款強大的三方工具。那么,它是否能夠如其名字那般“美麗”呢?接下來,讓我們共同揭開這個謎團!
Beautiful Soup 也是一個 Python 的 XML 和 HTML 的解析庫,其提供了簡單的,Python 式的函數(shù)來處理導航,搜索,修改分析樹等功能(來自官方介紹)。
Beautiful Soup來源于愛麗絲夢游仙境
在使用 Beautiful Soup 之前,需要安裝好 lxml(推薦 lxml 解析器) 和其自身的庫。
pip install beautifulsoup4
pip install lxml
beautiful Soup 在解析過程中依賴各種解析器,除了支持 Python 標準的解析器外,還支持其他的三方解析器(如: lxml)。
各種解析器優(yōu)缺點
一般在使用的過程中,推薦使用 lxml,因為 lxml 本身也是一個非常優(yōu)秀的解析庫,也支持 XML 的解析。
假設有以下內(nèi)容的 html 文檔。
<!DOCTYPE html>
<html lang="en">
<body>
<div>
<ul>
<li class="class-0">
<a href="a.html">
<span>第一個標簽</span>
</a>
</li>
</ul>
</div>
</body>
</html>
from bs4 import BeautifulSoup
# 初始化BeautifulSoup,并指定lxml為解析器
soup = BeautifulSoup(open("index.html"),
"lxml")
# 獲取span標簽
print(soup.span)
print(soup.span.string)
# <span>第一個標簽</span>
# 第一個標簽
如上代碼,BeautifulSoup 方法有有兩個參數(shù), 第一個參數(shù)接受一個 html 文檔,第二個參數(shù)指定解釋器類型,這樣就初始化了一個BeautifulSoup 的對象,后續(xù)就可以使用這個對象來解析和獲取 HTML 中的數(shù)據(jù),如上方獲取 span, 并獲取 span 的內(nèi)容。
獲取 bs 對象有兩種方式,一種是直接使用文本字符,另一種是讀取文檔:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("<html>data</html>")
通過上邊的代碼示例可以看到,在獲取到 bs 對象后,后續(xù)直接調用節(jié)點名稱就可以獲取到節(jié)點對象,再調用 string 屬性就可以獲取到節(jié)點的文本內(nèi)容,相較于使用正則表達式或者 XPath 效率是非常高的。
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>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
# 獲取title標簽
soup.title
# <title>The Dormouse's story</title>
#獲取title標簽名字
soup.title.name
# u'title'
#獲取title標簽文本內(nèi)容
soup.title.string
# u'The Dormouse's story'
#獲取title父標簽
soup.title.parent.name
# u'head'
#獲取p標簽
soup.p
# <p class="title"><b>The Dormouse's story</b></p>
#獲取p標簽的class屬性
soup.p['class']
# u'title'
# 獲取a標簽
soup.a
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
# 查找所有的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>]
# 查找id為link3的標簽
soup.find(id="link3")
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
雖然在 Beautiful Soup 中可以將復雜的 HTML 文檔轉換為樹形結構,但是從大體可歸納為以下 4 個對象:
Tag:Tag 對象用于表示 HTML 和 XML 文檔中的 tag 標簽。
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
type(tag)
# <class 'bs4.element.Tag'>
tag.name
# u'b'
tag['class']
# u'boldest'
如上任何的標簽在Beautiful Soup 都表示為一個 Tag 對象,且從該對象上獲取到當前標簽的各種屬性值。
NavigableString :表示 Tag 中被包裹的字符串
tag.string
# u'Extremely bold'
type(tag.string)
# <class 'bs4.element.NavigableString'>
BeautifulSoup :該對象表示文檔整體的一個類,即初始化后獲得的類,所以獲取到該類,就獲取到了整個文檔。需要注意需要和上邊 Tag 類做出區(qū)分,BeautifulSoup 類是特殊的 Tag 類。
Comment :表示文檔中的注釋內(nèi)容,其本質也是一個特殊的NavigableString 對象,但由于其特殊性,單獨做封裝處理。
除了上邊的屬性選擇器和方法選擇器外,Beautiful Soup 還提供 CSS 選擇器,這對于有前端樣式開發(fā)經(jīng)驗的同學來說是非常給力的一個特性。通過 CSS 選擇器也可以輕松的選定各個節(jié)點,但在使用中和上邊的有所不同需要調用 .selsect() 方法, 如下方代碼:
soup.select("title")
# [<title>The Dormouse's story</title>]
soup.select("p:nth-of-type(3)")
# [<p class="story">...</p>]
有不熟悉css選擇器的小伙伴可以在w3c上學習,一般基礎的選擇器就可勝任絕大多數(shù)數(shù)據(jù)獲取的任務。
天晚上竟然忙忘了,忘了給大家推文了。等到反應過來的時候,已經(jīng)晚了,懶得不想寫了。最近確實很忙,各種事一堆,真的是希望自己能夠有個三頭六臂,踩著風火輪,效率高點就好了。
今天給大家推薦一個不錯的小程序富文本解析器。
我們都知道今年小程序不是一般的火,很多人都在做微信小程序,我也有一直在開發(fā),最近正好用到了富文本解析的問題,所以,在 GitHub 上找到了一個不錯的開源庫。用起來,還挺順手,挺不錯的,所以非常值得推薦給大家。
這個富文本解析器不僅支持解析轉換 HTML ,還支持 MarkDown 呢,它就是:wxParse - 微信小程序富文本解析組件。其作者用就是:將 Html/Markdown 轉換為微信小程序的可視化方案。
特性如下:
效果圖,也如下:
真的非常不錯哦。使用方法很簡單,在這里我就不介紹了,大家直接去看項目中的介紹吧!里面用法介紹的很清楚,詳細。
開源項目地址:https://github.com/icindy/wxParse
開源項目作者:icindy
今天的推薦不知道大家喜歡嗎?如果你喜歡,請在文章底部留言和點贊,以表示對我的支持,你們的留言和點贊是我持續(xù)更新的動力哦!
章魚貓在此感謝大家的關注和支持。喜歡我,就趕緊關注我,給我點贊吧!
互聯(lián)網(wǎng)+數(shù)據(jù)+人工智能時代,仍然有越來越多的網(wǎng)頁數(shù)據(jù)采集需求,且案例眾多,網(wǎng)頁數(shù)據(jù)采集在企業(yè)中落地的實際應用也在不斷地顯著增加。實際工作中可能需要為一個旅游網(wǎng)站獲取航班時間或Airbnb列表,或者可能需要收集數(shù)據(jù),例如來自不同電子商務網(wǎng)站的價格表,以便進行價格比較。很多時候也會出于個人需要,比如為機器學習收集訓練和測試數(shù)據(jù)集等。這就是web網(wǎng)頁數(shù)據(jù)采集發(fā)揮作用的地方。
在這里,我們將探討最好的網(wǎng)頁數(shù)據(jù)采集工具。
https://github.com/puppeteer/puppeteer
Puppeteer是Google放出的“終極”大招,它不只是一個網(wǎng)頁數(shù)據(jù)采集工具,實際上是一個Node庫,它提供了一個高階API,類似于Selenium Webdriver的高級別API,默認是通過DevTools協(xié)議控制無界面Chrome,還可以通過配置用于有界面Chrome。
使用Puppeteer,我們可以做以下事情:
# 用來生成網(wǎng)頁截圖或PDF文件。
# 用來創(chuàng)建全新的自動化測試環(huán)境。
# 用來捕捉網(wǎng)頁的時間線軌跡以診斷性能問題。
# 抓取一個SPA(單頁應用程序)并生成網(wǎng)頁渲染之前的內(nèi)容(服務器端渲染(SSR))。
API像自然語言一樣簡潔明了,沒有callback,幾行代碼就能搞定我們所需的一切。
https://github.com/cheeriojs/cheerio
Cheerio是一個標記解析庫,提供了對結果數(shù)據(jù)(比如服務端接口返回的數(shù)據(jù))結構進行解析的API,Cheerio最好的一點是它不像web瀏覽器那樣解釋結果數(shù)據(jù)。然而,它既不產(chǎn)生視覺呈現(xiàn)、也不加載外部資源或請求CSS。如果實際項目中需要上面這些能力的話,就需要考慮類似PhantomJS這樣的項目。
值得注意的是,用Node.js采集數(shù)據(jù)在Cheerio中要容易得多。
比如采集http://v.163.com/special/opencourse/englishs1.html:
https://github.com/request/request-promise
Request-Promise是npm庫中的一個變體,它通過自動化的瀏覽器提供了一個更快的解決方案。當內(nèi)容不是動態(tài)呈現(xiàn)時,可以使用此網(wǎng)頁數(shù)據(jù)采集工具。如果要處理的網(wǎng)站有一個認證系統(tǒng),它可以是一個更先進的解決方案。如果我們把它和Puppeteer相比,它的用法正好相反。
https://github.com/segmentio/nightmare
Nightmare是一個高級的瀏覽器自動化庫,它以瀏覽器的形式運行Electron程序。Electron (https://electronjs.org/)是一個使用 JavaScript, HTML 和 CSS 等 Web 技術創(chuàng)建原生程序的框架,兼容Mac、Windows和Linux,可以構建出三個平臺的桌面應用程序,它負責比較難搞的部分,我們只需把精力放在應用的核心上即可【Electron剛剛加入了 OpenJS 基金會】。Nightmare是一個濃縮的版本,或者我們可以說,是一個簡化版的Puppeteer。它有提供更多靈活性的插件,包括對文件下載的支持。
Nightmare的目標是對外公開幾個使用起來像是同步的方法調用,比如goto、type和click,而不是深度嵌套的回調。最初是為在沒有api的站點之間自動化執(zhí)行任務而設計的,但最常用于UI測試和數(shù)據(jù)采集。
還可以運行mocha測試。
https://www.npmjs.com/package/osmosis
Osmosis是一個HTML/XML解析器和網(wǎng)頁數(shù)據(jù)采集工具。它是用Node.js編寫的,用CSS3/xpath選擇器和輕量級HTTP包裝器打包。如果我們將它與Cheerio、jQuery和jsdom進行比較,則它沒有顯著的依賴性。
實例代碼如下:
【202001】
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。