1. 程式人生 > >Python爬蟲之BeautifulSoup

Python爬蟲之BeautifulSoup

簡介

Beautiful Soup提供一些簡單的、python式的函式用來處理導航、搜尋、修改分析樹等功能。它是一個工具箱,通過解析文件為使用者提供需要抓取的資料,因為簡單,所以不需要多少程式碼就可以寫出一個完整的應用程式。Beautiful Soup自動將輸入文件轉換為Unicode編碼,輸出文件轉換為utf-8編碼。你不需要考慮編碼方式,除非文件沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。然後,你僅僅需要說明一下原始編碼方式就可以了。

Beautiful Soup已成為和lxmlhtml6lib一樣出色的python直譯器,為使用者靈活地提供不同的解析策略或強勁的速度。

安裝

Python
123 pip install BeautifulSoup4easy_install BeautifulSoup4

建立BeautifulSoup物件

首先應該匯入BeautifulSoup類庫 from bs4 import BeautifulSoup
下面開始建立對像,在開始之前為了方便演示,先建立一個html文字,如下:

Python
1234567891011 html="""<html><head><title>The Dormouse's story</title></head><body><p class="title" name="dromouse"><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>"""

建立物件:soup=BeautifulSoup(html,’lxml’),這裡的lxml是解析的類庫,目前來說個人覺得最好的解析器了,一直在用這個,安裝方法:

Python
1 pip install lxml

Tag

Tag就是html中的一個標籤,用BeautifulSoup就能解析出來Tag的具體內容,具體的格式為soup.name,其中name是html下的標籤,具體例項如下:

Python
12 printsoup.title # 輸出title標籤下的內容,包括此標籤,這個將會輸出<title>The Dormouse's story</title>printsoup.head

注意:

這裡的格式只能獲取這些標籤的第一個,後面會講到獲取多個標籤的方法。其中對於Tag有兩個重要的屬性name和attrs,分別表示名字和屬性,介紹如下:

  • name:對於Tag,它的name就是其本身,如soup.p.name就是p
  • attrs是一個字典型別的,對應的是屬性-值,如print soup.p.attrs,輸出的就是{‘class’: [‘title’], ‘name’: ‘dromouse’},當然你也可以得到具體的值,如print soup.p.attrs[‘class’],輸出的就是[title]是一個列表的型別,因為一個屬性可能對應多個值,當然你也可以通過get方法得到屬性的,如:print soup.p.get(‘class’)。還可以直接使用print soup.p[‘class’]

get

get方法用於得到標籤下的屬性值,注意這是一個重要的方法,在許多場合都能用到,比如你要得到<img src=”#”>標籤下的影象url,那麼就可以用soup.img.get(‘src’),具體解析如下:

Python
1 printsoup.p.get("class")#得到第一個p標籤下的src屬性

string

得到標籤下的文字內容,只有在此標籤下沒有子標籤,或者只有一個子標籤的情況下才能返回其中的內容,否則返回的是None具體例項如下:

Python
123 printsoup.p.string#在上面的一段文字中p標籤沒有子標籤,因此能夠正確返回文字的內容printsoup.html.string#這裡得到的就是None,因為這裡的html中有很多的子標籤

get_text()

可以獲得一個標籤中的所有文字內容,包括子孫節點的內容,這是最常用的方法

搜尋文件樹

find_all( name , attrs , recursive , text , **kwargs )

find_all是用於搜尋節點中所有符合過濾條件的節點

  1. name引數:是Tag的名字,如p,div,title …..
    soup.find_al
    l("p") 查詢所有的p標籤,返回的是[<b>The Dormouse's story</b>],可以通過遍歷獲取每一個節點,如下:
    Python
    123 ps=soup.find_all("p")forpinps:printp.get('class')#得到p標籤下的class屬性

    傳入正則表示式:soup.find_all(re.compile(r’^b’)查詢以b開頭的所有標籤,這裡的body和b標籤都會被查到
    傳入類列表:如果傳入列表引數,BeautifulSoup會將與列表中任一元素匹配的內容返回.下面程式碼找到文件中所有<a>標籤和<b>標籤
    Python
    1 soup.find_all(["a","b"])
  2. KeyWords引數,就是傳入屬性和對應的屬性值,或者一些其他的表示式
    • soup.find_all(id='link2'),這個將會搜尋找到所有的id屬性為link2的標籤。傳入正則表示式soup.find_all(href=re.compile("elsie")),這個將會查詢所有href屬性滿足正則表示式的標籤
    • 傳入多個值:soup.find_all(id='link2',class_='title') ,這個將會查詢到同時滿足這兩個屬性的標籤,這裡的class必須用class_傳入引數,因為classpython中的關鍵詞
    • 有些屬性不能通過以上方法直接搜尋,比如html5中的data-*屬性,不過可以通過attrs引數指定一個字典引數來搜尋包含特殊屬性的標籤,如下:
      Python
      1234 # [<div data-foo="value">foo!</div>]data_soup.find_all(attrs={"data-foo":"value"})#注意這裡的atts不僅能夠搜尋特殊屬性,亦可以搜尋普通屬性soup.find_all("p",attrs={'class':'title','id':'value'})#相當與soup.find_all('p',class_='title',id='value')
  3. text引數:通過 text 引數可以搜搜文件中的字串內容.與 name 引數的可選值一樣, text 引數接受 字串 , 正則表示式 , 列表, True
    Python
    12345678 soup.find_all(text="Elsie")# [u'Elsie']soup.find_all(text=["Tillie","Elsie","Lacie"])# [u'Elsie', u'Lacie', u'Tillie']soup.find_all(text=re.compile("Dormouse"))[u"The Dormouse's story",u"The Dormouse's story"]
  4. limit引數:find_all() 方法返回全部的搜尋結構,如果文件樹很大那麼搜尋會很慢.如果我們不需要全部結果,可以使用 limit 引數限制返回結果的數量.效果與SQL中的limit關鍵字類似,當搜尋到的結果數量達到 limit 的限制時,就停止搜尋返回結果.文件樹中有3tag符合搜尋條件,但結果只返回了2個,因為我們限制了返回數量,程式碼如下:
    Python
    123 soup.find_all("a",limit=2)# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
  5. recursive 引數:呼叫tagfind_all() 方法時,BeautifulSoup會檢索當前tag的所有子孫節點,如果只想搜尋tag的直接子節點,可以使用引數 recursive=False

find( name , attrs , recursive , text , **kwargs )

它與 find_all() 方法唯一的區別是 find_all() 方法的返回結果是值包含一個元素的列表,而 find() 方法直接返回結果,就是直接返回第一匹配到的元素,不是列表,不用遍歷,如soup.find("p").get("class")

通過標籤名查詢

Python
123456 printsoup.select('title')#[<title>The Dormouse's story</title>]printsoup.select('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>]

通過類名查詢

Python
12 printsoup.select('.sister')#[<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名查詢

Python
12 printsoup.select('#link1')#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

組合查詢

學過 css 的都知道 css 選擇器,如 p #link1 是查詢 p 標籤下的 id 屬性為 link1 的標籤

Python
12345 printsoup.select('p #link1')#查詢p標籤中內容為id屬性為link1的標籤#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]printsoup.select("head > title")#直接查詢子標籤#[<title>The Dormouse's story</title>]

屬性查詢

查詢時還可以加入屬性元素,屬性需要用中括號括起來,注意屬性和標籤屬於同一節點,所以中間不能加空格,否則會無法匹配到。

Python
123456 printsoup.select('a[class="sister"]')#[<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>]printsoup.select('a[href="http://example.com/elsie"]')#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

同樣,屬性仍然可以與上述查詢方式組合,不在同一節點的空格隔開,同一節點的不加空格,程式碼如下:

Python
12 printsoup.select('p a[href="http://example.com/elsie"]')#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

以上的 select 方法返回的結果都是列表形式,可以遍歷形式輸出,然後用 get_text() 方法來獲取它的內容

Python
123456 soup=BeautifulSoup(html,'lxml')printtype(soup.select('title'))printsoup.select('title')[0].get_text()fortitle insoup.select('title'):printtitle.get_text()

相關推薦

python 爬蟲BeautifulSoup 庫的基本使用

rip data lin value 訪問 pytho 輕松 register tex import urllib2url = ‘http://www.someserver.com/cgi-bin/register.cgi‘values = {}values[‘name‘]

python爬蟲BeautifulSoup學習

1. Beautiful Soup的簡介 簡單來說,Beautiful Soup是python的一個庫,最主要的功能是從網頁抓取資料。官方解釋如下: Beautiful Soup提供一些簡單的、python式的函式用來處理導航、搜尋、修改分析樹等功能。它是一個工具箱,通過解析文件為使

python爬蟲BeautifulSoup解析網頁

BeautifulSoup是一個很簡單又好用的庫,不過解析速度相對比較慢,使用如下: 1,安裝 pip install bs4  (被加到了bs4中) #python3用pip3 install bs4 ,如果有許可權問題,可以試試,pip install bs4  --

Python爬蟲BeautifulSoup

簡介 Beautiful Soup提供一些簡單的、python式的函式用來處理導航、搜尋、修改分析樹等功能。它是一個工具箱,通過解析文件為使用者提供需要抓取的資料,因為簡單,所以不需要多少程式碼就可以寫出一個完整的應用程式。Beautiful Soup自動將輸入文件轉換為Unicode編碼,輸出文件轉換為u

[原創]python爬蟲BeautifulSoup,爬取網頁上所有圖片標題並存儲到本地文件

%20 分享圖片 本地 col cbc quest 執行 python div from bs4 import BeautifulSoup import requests import re import os r = requests.get("https:/

Python爬蟲BeautifulSoup

1. BeautifulSoup 1.1 解析庫 1)Python標準庫 # 使用方法 BeautifulSoup(markup, "html.parser") # 優勢 Python的內建標準庫,執行速度適中,文件容錯能力強 # 劣勢 Python2.7.3 或者 python3.2.2 前的版本容錯

Python爬蟲利用BeautifulSoup爬取豆瓣小說(三)——將小說信息寫入文件

設置 one 行為 blog 應該 += html uil rate 1 #-*-coding:utf-8-*- 2 import urllib2 3 from bs4 import BeautifulSoup 4 5 class dbxs: 6 7

Python開發爬蟲BeautifulSoup解析網頁篇:爬取安居客網站上北京二手房數據

澳洲 pytho 目標 www. 委托 user info .get web 目標:爬取安居客網站上前10頁北京二手房的數據,包括二手房源的名稱、價格、幾室幾廳、大小、建造年份、聯系人、地址、標簽等。 網址為:https://beijing.anjuke.com/sale/

python爬蟲Request,BeautifulSoup進階

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup from datetime import datetime import re re

python學習(6):python爬蟲requests和BeautifulSoup的使用

前言: Requests庫跟urllib庫的作用相似,都是根據http協議操作各種訊息和頁面。 都說Requests庫比urllib庫好用,我也沒有體會到好在哪兒。 但是,urllib庫有一點不爽的

一個鹹魚的Python爬蟲路(三):爬取網頁圖片

you os.path odin 路徑 生成 存在 parent lose exist 學完Requests庫與Beautifulsoup庫我們今天來實戰一波,爬取網頁圖片。依照現在所學只能爬取圖片在html頁面的而不能爬取由JavaScript生成的圖。所以我找了這個網站

[Python爬蟲] 十五:Selenium +phantomjs根據微信公眾號抓取微信文章

頭部 drive lac 過程 標題 操作 函數 軟件測試 init   借助搜索微信搜索引擎進行抓取   抓取過程   1、首先在搜狗的微信搜索頁面測試一下,這樣能夠讓我們的思路更加清晰        在搜索引擎上使用微信公眾號英文名進行“搜公眾號&r

玩轉python爬蟲URLError異常處理

bsp 無法識別 pac 使用 cin lai 網絡 處理方式 地址 這篇文章主要介紹了python爬蟲的URLError異常處理,詳細探尋一下URL\HTTP異常處理的相關內容,通過一些具體的實例來分析一下,非常的簡單,但是卻很實用,感興趣的小夥伴們可以參考一下 本節

python爬蟲正則表達式

ner cde 輸入 set 神奇 tro 轉義 規則 error 一、簡介   正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。

[Python爬蟲] 十九:Selenium +phantomjs 利用 pyquery抓取超級TV網數據

images 判斷 nco dex onf etc lac lin 利用   一、介紹     本例子用Selenium +phantomjs爬取超級TV(http://www.chaojitv.com/news/index.html)的資訊信息,輸入給定關鍵字抓取

Python爬蟲爬取煎蛋網妹子圖

創建目錄 req add 註意 not 相同 esp mpi python3 這篇文章通過簡單的Python爬蟲(未使用框架,僅供娛樂)獲取並下載煎蛋網妹子圖指定頁面或全部圖片,並將圖片下載到磁盤。 首先導入模塊:urllib.request、re、os import

python爬蟲git的使用

mage .cn 沒有 倉庫 本地倉庫 odin src python爬蟲 建立 1、初始化文件夾為版本控制文件夾,首先建立一個文件夾,進入這個文件夾以後輸入git init初始化這個文件夾。 2、Git幾種位置概念 1、本地代碼:本地更改完代碼以後,雖然是存放在git的

爬蟲BeautifulSoup, CSS

ont min 文件打開 速度 名稱 markup css選擇器 -1 全部結果 1. Beautiful Soup的簡介 2. Beautiful Soup 安裝 可以利用 pip 或者 easy_install 來安裝,以下兩種方法均可 easy_install bea

python爬蟲git的使用(coding.net的使用)

git push github上 版本 es2017 push 我們 執行命令 pytho 最好的 1、註冊coding.net賬號,然後登陸。 2、創建項目 套路和github都一樣。 1.1、我們在遠程倉庫上創建了一個倉庫,這樣的話,我們需要在本地隨便建立一

python爬蟲requests模塊

.post 過大 form表單提交 www xxxxxx psd method date .com 一. 登錄事例 a. 查找汽車之家新聞 標題 鏈接 圖片寫入本地 import requests from bs4 import BeautifulSoup import