摘要:文檔寫得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代碼中派上用場了。
關于爬蟲的案例和方法,我們已講過許多。不過在以往的文章中,大多是關注在 如何把網(wǎng)頁上的內(nèi)容抓取下來 。今天我們來分享下,當你已經(jīng)把內(nèi)容爬下來之后, 如何提取出其中你需要的具體信息 。
網(wǎng)頁被抓取下來,通常就是 str 字符串類型的對象 ,要從里面尋找信息,最直接的想法就是直接通過字符串的 find 方法 和 切片操作 :
s = "價格:15.7 元
" start = s.find("價格:") end = s.find(" 元") print(s[start+3:end]) # 15.7
這能應付一些極簡單的情況,但只要稍稍復雜一點,這么寫就會累死人。更通用的做法是使用 正則表達式 :
import re s = "價格:15.7 元
" r = re.search("[d.]+", s) print(r.group()) # 15.7
正則表達式是處理文本解析的萬金油,什么情況都可以應對。但可惜掌握它需要一定的學習成本, 原本我們有一個網(wǎng)頁提取的問題,用了正則表達式,現(xiàn)在我們有了兩個問題。
HTML 文檔本身是 結(jié)構化的文本 ,有一定的規(guī)則,通過它的結(jié)構可以簡化信息提取。于是,就有了 lxml、pyquery、BeautifulSoup 等網(wǎng)頁信息提取庫。一般我們會用這些庫來提取網(wǎng)頁信息。其中, lxml 有很高的解析效率,支持 xPath 語法 (一種可以在 HTML 中查找信息的規(guī)則語法); pyquery 得名于 jQuery(知名的前端 js 庫),可以用類似 jQuery 的語法解析網(wǎng)頁 。但我們今天要說的,是剩下的這個:
BeautifulSoupBeautifulSoup(下文簡稱 bs)翻譯成中文就是“美麗的湯”,這個奇特的名字來源于《 愛麗絲夢游仙境 》(這也是為何在其官網(wǎng)會配上奇怪的插圖,以及用《愛麗絲》的片段作為測試文本)。
bs 最大的特點我覺得是 簡單易用 ,不像正則和 xPath 需要刻意去記住很多特定語法,盡管那樣會效率更高更直接。 對大多數(shù) python 使用者來說,好用會比高效更重要 。這也是我自己使用并推薦 bs 的主要原因。
接下來介紹點 bs 的基本方法,讓你看完就能用起來。考慮到“只收藏不看黨”的閱讀體驗,先給出一個“ 嫌長不看版 ”的總結(jié):
隨 anaconda 附帶,也可以通過 pip 安裝
指定 不同解析器在性能、容錯性上會有差異 ,導致結(jié)果也可能不一樣
基本使用流程: 通過文本初始化 bs 對象 -> 通過 find/find_all 或其他方法檢測信息 -> 輸出或保存
可以迭代式的查找,比如先定位出一段內(nèi)容,再其上繼續(xù)檢索
開發(fā)時應注意不同方法的返回類型,出錯時多看報錯、多加輸出信息
官方文檔 很友好,也有中文,推薦閱讀
安裝推薦使用 pip 進行安裝(關于 pip 見前文《Crossin:如何安裝 Python 的第三方模塊》):
pip install beautifulsoup4
要注意,包名是 beautifulsoup4 ,如果不加上 4,會是老版本也就是 bs3,它是為了兼容性而存在,目前已不推薦。我們這里說 bs,都是指 bs4。
bs4 也可以直接通過安裝 anaconda 獲得(介紹見前文《Crossin:Python數(shù)據(jù)科學環(huán)境:Anaconda 了解一下》)。
bs 在使用時需要指定一個“ 解析器 ”:
html.parse - python 自帶,但容錯性不夠高,對于一些寫得不太規(guī)范的網(wǎng)頁會丟失部分內(nèi)容
lxml - 解析速度快,需額外安裝
xml - 同屬 lxml 庫,支持 XML 文檔
html5lib - 最好的容錯性,但速度稍慢
這里的 lxml 和 html5lib 都需要額外安裝,不過如果你用的是 anaconda,都是一并安裝好的。
快速上手我們就用官網(wǎng)上的文檔作例子:
html_doc = """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.
...
"""
使用 bs 的初始化操作,是用文本創(chuàng)建一個 BeautifulSoup 對象,建議手動指定解析器:
from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc, "html.parser")
獲取其中的某個結(jié)構化元素及其屬性:
soup.title # title 元素 #The Dormouse"s story soup.p # 第一個 p 元素 #The Dormouse"s story
soup.p["class"] # p 元素的 class 屬性 # ["title"] soup.p.b # p 元素下的 b 元素 # The Dormouse"s story soup.p.parent.name # p 元素的父節(jié)點的標簽 # body
并不是所有信息都可以簡單地通過結(jié)構化獲取,通常使用 find 和 find_all 方法進行查找:
soup.find_all("a") # 所有 a 元素 # [Elsie, # Lacie, # Tillie] soup.find(id="link3") # id 為 link3 的元素 # Tilliefind 和 find_all 可以有多個搜索條件疊加,比如 find("a", id="link3", class_="sister")
find 返回的是一個 bs4.element.Tag 對象 ,這個對象可以進一步進行搜索。如果有多個滿足的結(jié)果,find 只返回第一個 ;如果沒有,返回 None。
find_all 返回的是一個 由 bs4.element.Tag 對象組成的 list ,不管找到幾個或是沒找到,都是 list。
輸出:
x = soup.find(class_="story") x.get_text() # 僅可見文本內(nèi)容 # "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." x.prettify() # 元素完整內(nèi)容 # "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.
"如果你有前端開發(fā)經(jīng)驗,對 CSS 選擇器很熟悉,bs 也為你提供了相應的方法:
soup.select("html head title") # [The Dormouse"s story ] soup.select("p > #link1") # [Elsie]以上就是 BeautifulSoup 的一個極簡上手介紹,對于 bs 能做什么,想必你已有了一個初步認識。如果你要在開發(fā)中使用,建議再看下它的 官方文檔 。文檔寫得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代碼中派上用場了。更多的細節(jié)可以在使用時進一步搜索具體方法和參數(shù)設置。
中文版文檔 地址:
Beautiful Soup 4.2.0 文檔www.crummy.com
對于爬蟲的其他方面,推薦閱讀我們之前的相關文章:
Chrome開發(fā)者工具:爬蟲必備,掌握它就解決了一半的問題
requests:讓你的爬蟲開發(fā)效率提升8倍
goose 簡介:一鵝在手,抓遍全球
IP代理池:聽說你好不容易寫了個爬蟲,結(jié)果沒抓幾個就被封了?
selenium - 祖?zhèn)髋老x利器
Python爬蟲:一些常用的爬蟲技巧總結(jié)
爬蟲+網(wǎng)站開發(fā)實例:電影票比價網(wǎng)
════
其他文章及回答:
學編程:如何自學Python | 新手引導 | 一圖學Python
開發(fā)案例:智能防擋彈幕 | 紅包提醒 | 流浪地球
歡迎搜索及關注: Crossin的編程教室
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43349.html
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優(yōu)秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結(jié)構、語法...
摘要:官方解釋如下提供一些簡單的式的函數(shù)用來處理導航搜索修改分析樹等功能。廢話不多說,我們來試一下吧安裝目前已經(jīng)停止開發(fā),推薦在現(xiàn)在的項目中使用,不過它已經(jīng)被移植到了,也就是說導入時我們需要。 上一節(jié)我們介紹了正則表達式,它的內(nèi)容其實還是蠻多的,如果一個正則匹配稍有差池,那可能程序就處在永久的循環(huán)之中,而且有的小伙伴們也對寫正則表達式的寫法用得不熟練,沒關系,我們還有一個更強大的工具,叫Be...
摘要:是一個文章內(nèi)容提取器,可以從任意資訊文章類的網(wǎng)頁中提取文章主體,并提取標題標簽摘要圖片視頻等信息,且支持中文網(wǎng)頁。 爬蟲抓取數(shù)據(jù)有兩個頭疼的點,寫過爬蟲的小伙伴們一定都深有體會: 網(wǎng)站的 防抓取 機制。你要盡可能將自己偽裝成一個人,騙過對方的服務器反爬驗證。 網(wǎng)站的 內(nèi)容提取 。每個網(wǎng)站都需要你做不同的處理,而且網(wǎng)站一旦改版,你的代碼也得跟著更新。 第一點沒什么捷徑可走,套路見得多...
摘要:爬取糗百內(nèi)容代碼地址微信公眾號智能制造社區(qū),歡迎關注。爬蟲程序一般是通過模擬瀏覽器對相應發(fā)出請求,獲取數(shù)據(jù),并通過正則等手段匹配出頁面中我們所需的數(shù)據(jù)。庫基本介紹是學習爬蟲的一大利器。 爬取糗百內(nèi)容 GitHub 代碼地址https://github.com/injetlee/Python/blob/master/qiubai_crawer.py 微信公眾號:【智能制造社區(qū)】,歡迎關注...
摘要:先打開花千骨小說的目錄頁,是這樣的。網(wǎng)頁結(jié)構分析首先,目錄頁左上角有幾個可以提高你此次爬蟲成功后成就感的字眼暫不提供花千骨全集下載。打開盤查看花千骨文件。 知識就像碎布,記得縫一縫,你才能華麗麗地亮相。 1.Beautiful Soup 1.Beautifulsoup 簡介 此次實戰(zhàn)從網(wǎng)上爬取小說,需要使用到Beautiful Soup。Beautiful Soup為python的...
閱讀 2132·2023-04-26 03:06
閱讀 3580·2023-04-26 01:51
閱讀 2085·2021-11-24 09:38
閱讀 2452·2021-11-17 17:00
閱讀 2324·2021-09-28 09:36
閱讀 941·2021-09-24 09:47
閱讀 2586·2019-08-30 15:54
閱讀 1554·2019-08-30 15:44