靚湯是一個開源的Python庫。它使用導航解析器來抓取XML和HTML檔案的內容。您需要用於多種分析目的的資料。但是,如果您對Python和web抓取還不熟悉,那麼Python的漂亮的Soup庫對於web抓取專案來說是值得一試的。
有了Python的開源漂亮的Soup庫,您可以透過抓取網頁的任何部分或元素來獲取資料,並對過程進行最大程度的控制。在這篇文章中,我們來看看如何使用美麗的湯刮網站。
在繼續之前,在這篇Beautiful Soup教程文章中,我們將使用python3和beautifulsoup4,這是Beautiful Soup的最新版本。確保建立一個Python虛擬環境,將專案及其包與本地計算機上的專案及其包隔離開來。
要開始,必須在虛擬環境中安裝Beautiful Soup庫。BeautifulSoup作為PyPi包可用於所有作業系統,因此您可以透過終端使用pip install beautifulsoup4命令安裝它。
但是,如果您使用的是Debian或Linux,上面的命令仍然有效,但是您可以透過執行apt get install python3-bs4使用包管理器安裝它。
靚湯不會直接刮到URL。它只適用於現成的HTML或XML檔案。這意味著你不能直接把網址傳給它。為了解決這個問題,您需要先透過Python的請求庫獲取目標網站的URL,然後再將其提供給Beautiful Soup。
要使該庫可用於scraper,請透過終端執行pip install requests命令。
要使用XML解析器庫,請執行pip install lxml來安裝它。
在刪除任何你不熟悉的網站之前,最好的做法是檢查它的元素。您可以透過將瀏覽器切換到開發人員模式來實現這一點。如果您使用的是Google Chrome,那麼使用Chrome DevTools是非常容易的。
然而,有必要檢查一個網頁以瞭解更多關於它的HTML標記、屬性、類和id的資訊。這樣做會暴露網頁的核心元素及其內容型別。
它還可以幫助你制定最佳策略,你可以用它來獲得準確的資料,你想要從一個網站,以及你可以如何得到它。
現在您已經準備好了一切,開啟一個首選程式碼編輯器並建立一個新的Python檔案,給它一個選定的名稱。但是,如果您不熟悉透過命令列執行Python,也可以使用基於web的ide,比如Jupyter Notebook。
接下來,匯入必要的庫:
from bs4 import BeautifulSoupimport requests首先,讓我們看看請求庫是如何工作的:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com')print(website)當您執行上面的程式碼時,它返回200狀態,表示您的請求成功。否則,您將獲得一個400狀態或一些其他錯誤狀態,指示get請求失敗。
請記住始終用目標URL替換括號中的網站URL。
一旦您透過get請求獲得了網站,然後將其傳遞給Beautiful Soup,它現在可以使用內建的XML或HTML解析器將內容讀取為HTML或XML檔案,具體取決於您選擇的格式。
請看下面的程式碼片段,瞭解如何使用HTML解析器執行此操作:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com')soup = BeautifulSoup(website.content, 'html.parser')print(soup)上面的程式碼返回網頁的整個DOM及其內容。
您還可以透過使用prettify方法獲得一個更加一致的DOM版本。您可以嘗試檢視其輸出:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')print(soup.prettify())您還可以獲取網頁的純內容,而無需使用.text方法載入其元素:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')print(soup.text)你也可以用漂亮的湯颳去特定標籤中的內容。為此,需要在請求中包含目標標記的名稱。
例如,讓我們看看如何獲取網頁的h2標記中的內容。
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')print(soup.h2)在上面的程式碼片段中,soup.h2返回網頁的第一個h2元素,並忽略其餘元素。要載入所有h2元素,可以使用find\u all內建函式和Python的for迴圈:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')h2tags = soup.find_all('h2')for soups in h2tags: print(soups)該程式碼塊返回所有h2元素及其內容。但是,您可以使用.string方法獲取內容,而無需載入標記:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')h2tags = soup.find_all('h2')for soups in h2tags: print(soups.string)您可以對任何HTML標記使用此方法。你所需要做的就是用你喜歡的標籤替換h2標籤。
但是,您也可以透過將標記列表傳遞到find\u all方法中來獲取更多標記。例如,下面的程式碼塊將刪除a、h2和title標記的內容:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')tags = soup.find_all(['a', 'h2', 'title'])for soups in tags: print(soups.string)在使用DevTools檢查一個網站之後,它可以讓您更多地瞭解DOM中包含每個元素的id和class屬性。一旦你有了那條資訊,你就可以用這個方法來刮取網頁了。當目標元件的內容從資料庫迴圈出來時,它很有用。
您可以對id和類scraper使用find方法。與返回iterable物件的find\u all方法不同,find方法工作於一個不可iterable的目標,即本例中的id。所以,不需要使用for迴圈。
讓我們看一個如何使用id刮取以下頁面內容的示例:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')id = soup.find(id = 'enter the target id here')print(id.text)要對類名執行此操作,請將id替換為class。然而,編寫類直接導致語法混亂,因為Python將其視為關鍵字。要繞過該錯誤,需要在類前面寫一個下劃線,如下所示:class\。
本質上,包含id的行變成:
my_classes = soup.find(class_ = 'enter the target class name here')print(my_classes.text)但是,您也可以透過呼叫具有相應id或類的特定標記名來刮取網頁:
data = soup.find_all('div', class_ = 'enter the target class name here')print(data)您可以建立一個類,並將前面的所有程式碼放在該類中的一個函式中,以生成一個可重用的scraper,該scraper獲取一些標記及其id的內容。我們可以透過建立一個接受五個引數的函式來實現這一點:一個URL、兩個標記名及其對應的id或類。
假設你想從電子商務網站上搜刮襯衫的價格。下面的示例scraper類提取price和shirt標記及其相應的id或類,然後將其作為Pandas資料幀返回,其中“price”和shirt\u name作為列名。
如果您還沒有透過終端pip安裝pandas,請確保您已經透過終端pip安裝了pandas。
import pandas as pdclass scrapeit:try:def scrape(website=None, tag1=None, id1=None, tag2=None, id2=None):if not (website and tag1 and id1 and tag2 and id2)==None: try:page = requests.get(website)soup = BeautifulSoup(page.content, 'html.parser')infotag1 = soup.find_all(tag1, id1)infotag2 = soup.find_all(tag2, id2) priced = [prices.text for prices in infotag1]shirt = [shirts.text for shirts in infotag2]data = {'Price':priced, 'Shirt_name':shirt}info = pd.DataFrame(data, columns=['Price', 'Shirt_name'])print(info)except:print('Not successful')else:print('Oops! Please enter a website, two tags and thier corresponding ids')except:print('Not successful!')您剛剛建立的scraper是一個可重用的模組,您可以在另一個Python檔案中匯入並使用它。要從其類呼叫scrape函式,可以使用刮。刮('Website URL'、'price\u tag'、'price\u id'、'shirt\u tag'、'shirt\u id')。如果不提供URL和其他引數,else語句將提示您這樣做。
要在另一個Python檔案中使用scaper,可以像這樣匯入它:
from scraper_module import scrapeitscrapeit.scrape('URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id')注意:scraper\u module是包含scraper類的Python檔案的名稱。
如果你想更深入地瞭解如何最好地利用它,你也可以檢視漂亮的湯文件。
BeautifulSoup是一個強大的Python螢幕刮刀,它可以讓您控制在刮刀過程中資料的傳輸方式。它是一個很有價值的商業工具,因為它可以讓你訪問競爭對手的網路資料,如定價、市場趨勢等。
儘管我們在本文中**了一個標記刮刀,但是您仍然可以使用這個強大的Python庫來**更有用的刮刀工具。
...式設計師可以使用開源LibGDX框架從頭開始快速建立遊戲。這個框架可以匯出到任何支援Java的桌面平臺,再加上Android和iOS。這是一個簡單明瞭的框架,有利於快速開發。強烈推薦。 Haxe:Haxe是一種可以移植到許多其...
...還提供了大量的開源新聞和技巧。有教程和免費電子書,這個網站有一個由六個貢獻者組成的團隊,所以你可以期待許多不同的聲音。 ...
...究了Java程式設計。儘管如此,它仍然是初學者友好的。這個refcard涵蓋了從設定到Java程式設計以及測試I/O庫的所有內容。因此,帶有Java和Raspberry Pi refcard的DZone IoT應用程式提供了全面的軟體和硬體概述。DZone的IoT部分提供了一個...
如果您正在考慮學習Python,那麼您可能會被初始設定過程弄得不知所措。您需要在系統上安裝Python,然後學習如何使用命令列處理程式碼,或者學習如何使用互動式shell,或者學習如何設定pythonide。 ...
...個你想要的網站,如果你喜歡質量而不是數量的話——在這個例子中,這意味著每個月都會有一個新的教程,但是每個教程都是獨一無二的,功能齊全的。你會從每個人身上學到很多。 ...
...ootstrap和WordPress建立互動式網站。高階課程包括使用PHP7、Python和MySQL的伺服器端編碼。 ...
...你的知識更進一步的一種方法是參加專門的課程。同時,用這些TensorFlow專案來實踐機器學習和Raspberry Pi,你可以自己嘗試。 ...
... 你會找到教程和指南,比如Python、C++、PHP、谷歌Analytics、Alexa甚至Bitcoin。 ...
... 現代瀏覽器允許我們瞭解這個過程的一些細節。在Windows上的googlechrome中,您可以按Ctrl+Shift+I或右鍵單擊並選擇Inspect。視窗將顯示如下螢幕。 ...
...再上學了,也不意味著你應該停止學習。恰恰相反:今天這個永遠聯絡在一起的世界讓你比以往任何時候都更容易瞭解任何你能想象到的話題。 ...