1. 程式人生 > >BeautifulSoup4 提取資料爬蟲用法詳解

BeautifulSoup4 提取資料爬蟲用法詳解

Beautiful Soup 是一個HTML/XML 的解析器,主要用於解析和提取 HTML/XML 資料。 
它基於 HTML DOM 的,會載入整個文件,解析整個 DOM樹,因此時間和記憶體開銷都會
大很多,所以效能要低於lxml。 BeautifulSoup 用來解析 HTML 比較簡單,API非常人性化,支援CSS選擇器、Python
標準庫中的HTML解析器,也支援 lxml 的 XML解析器。雖然說BeautifulSoup4 簡單容易比較上手,但是匹配效率還是遠遠不如正則以及xpath的,一般不推薦使用,推薦正則的使用。

第一步:pip install beautifulsoup4 ,萬事開頭難,先安裝 beautifulsoup4,安裝成功後就完成了第一步。

第二步:匯入from bs4 import BeautifulSoup 這個模組

第三步:建立 Beautiful Soup 物件          soup = BeautifulSoup(html) 

開始使用:

 Beautiful Soup將複雜HTML文件轉換成一個複雜的樹形結構,每個節點都是Python對
象,所有物件可以歸納為 4種: (1)Tag (2) NavigableString (3) BeautifulSoup (4) Comment 

(1)用BeautifulSoup來獲取Tags :Tag 通俗點講就是 HTML 中的一個個標籤,直接用BeautifulSoup來呼叫

soup = BeautifulSoup(html,’lxml’) 
print(soup.title) 
print(soup.head) 
print(soup.a) 
print(soup.p)
 print(type(soup.p))

這樣就可以得到你想要的標籤內容了。

tag還可以進行增刪改查的操作:

#soup 物件本身比較特殊,它的 name 即為 [document] 
print(soup.name) 
print(soup.head.name) 
#把 p 標籤的所有屬性列印輸出了出來,得到的型別是一個字典。 
print(soup.p.attrs) 
#根據名稱獲取對應的屬性值,型別為列表 
print(soup.p['class'])  
print(soup.p.get('class')) 
# 可以對這些屬性和內容等等進行修改 
soup.p['class'] = "newClass" 
print(soup.p)  
# 刪除屬性
 del soup.p['class'] 
 print(soup.p)

(2)  NavigableString 

獲取標籤內部的文字用 .string 即可

print(soup.p.string) 
# The Dormouse's story 
 
print(type(soup.p.string)) 
# In [13]: <class 'bs4.element.NavigableString'

(3)   BeautifulSoup

BeautifulSoup 物件表示的是一個文件的內容。大部分時候,可以把它當作 Tag物件,是
一個特殊的 Tag,我們可以分別獲取它的型別,名稱,以及屬性

print(type(soup.name)) 
# <type 'unicode'>  
print(soup.name) 
# [document] 
print(soup.attrs) 
# 文件本身的屬性為空 # {} 

(4) Comment

Comment物件是一個特殊型別的NavigableString 物件,其輸出註釋但不包含註釋符號。 

print(soup.a) 
# <a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a> 
 
print(soup.a.string)
 # Elsie  

 
print(type(soup.a.string))
 # <class 'bs4.element.Comment'> 

a 標籤裡的內容實際上是註釋,但是如果我們利用 .string 來輸出它的內容時,註釋符號已經去掉了 

一      開始搜尋文件樹:.find_all(name, attrs, recursive, text, **kwargs) 

1)name 引數 
name 引數可以查詢所有名字為 name 的 tag,字串物件會被自動忽略掉 
A.傳字串 
Beautiful Soup會查詢與字串完整匹配的內容 
範例:用於查詢文件中所有的<b>標籤: 
print(soup.find_all('b')) print(soup.find_all('a')) 
B.傳正則表示式 
Beautiful Soup會通過正則表示式的 match()來匹配內容. 
範例:找出所有以 b開頭的標籤,這表示<body>和<b>標籤都應該被找到 
import re for tag in soup.find_all(re.compile("^b")):     print(tag.name) 
C.傳列表 
Beautiful Soup會將與列表中任一元素匹配的內容返回. 
範例:找到文件中所有<a>標籤和<b>標籤: 
print(soup.find_all(["a", "b"])) 
2)keyword 引數 
print(soup.find_all(id='link2')) 
3)text 引數 
text 引數接受字串,正則表示式,列表, 可以搜搜文件中的字串內容 
print(soup.find_all(text="Elsie")) 
print(soup.find_all(text=["Tillie", "Elsie", "Lacie"])) 
print(soup.find_all(text=re.compile("Dormouse"))) 

二 CSS選擇器      (重點!!!!!!)

寫 CSS時,標籤名不加任何修飾,類名前加.,id名前加# 
可以利用類似的 soup.select()方法來篩選元素,返回結果是 list 
soup.select_one() 返回值是list的首個。 
(1)通過標籤名查詢 
print(soup.select('title'))  print(soup.select('a')) print(soup.select('b')) 
(2)通過類名查詢 
print(soup.select('.sister')) 
(3)通過 id 名查詢 
print(soup.select('#link1')) 
(4)組合查詢 
組合查詢即和寫 class檔案時,標籤名與類名、id名進行的組合原理是一樣的,例如查詢 
p 標籤中,id 等於 link1的內容,二者需要用空格分開 
print(soup.select('p #link1')) 直接子標籤查詢,則使用 > 分隔 
print(soup.select("head > title")) 
(5)屬性查詢 
查詢時還可以加入屬性元素,屬性需要用中括號括起來,注意屬性和標籤屬於同一節點,
所以中間不能加空格,否則會無法匹配到。 
print(soup.select('a[class="sister"]')) 
print(soup.select('a[href="http://example.com/elsie"]')) 
同樣,屬性仍然可以與上述查詢方式組合,不在同一節點的空格隔開,同一節點的不加
空格 
print(soup.select('p a[href="http://example.com/elsie"]')) 
(6)獲取內容 
可以遍歷 select 方法返回的結果,然後用 get_text() 方法來獲取它的內容。 
soup = BeautifulSoup(html, 'lxml') 
print(type(soup.select('title'))) 
print(soup.select('title')[0].get_text()) 
for title in soup.select('title'):     
print(title.get_text()) 

學會以上這些,基本就可以自己掌握BeautifulSoup4的使用了

相關推薦

BeautifulSoup4 提取資料爬蟲用法

Beautiful Soup 是一個HTML/XML 的解析器,主要用於解析和提取 HTML/XML 資料。  它基於 HTML DOM 的,會載入整個文件,解析整個 DOM樹,因此時間和記憶體開銷都會 大很多,所以效能要低於lxml。 BeautifulSoup 用來解析

Android官方資料繫結框架DataBinding用法+附帶DEMO原始碼

今天來了解一下Android最新給我們帶來的資料繫結框架——Data Binding Library。資料繫結框架給我們帶來了更大的方便性,以前我們可能需要在Activity裡寫很多的findViewById,煩人的程式碼也增加了我們程式碼的耦合性,現在我們馬上就

Vue2.0學習——axios用法2引入本地json資料(axios和vue-axios)

前面對愛可信有了一個全面的介紹,下面結合例項說一下axios和vue-axios,以及如何用axios請求本地json資料。首先看一下將axios註冊成全域性函式的用法:main.js import axios from 'axios' Vue.prototype.axio

python爬蟲基礎:Beautiful Soup用法

前言 說到爬蟲,我們不得不提起Beautiful Soup這個爬蟲利器,Beautiful Soup是一個可以從HTML或XML

JavaScript中return的用法

style 返回 www log tle blog 意思 charset fun 1、定義:return 從字面上的看就是返回,官方定義return語句將終止當前函數並返回當前函數的值,可以看下下面的示例代碼: <!DOCTYPE html><html l

SVN trunk(主線) branch(分支) tag(標記) 用法和詳細操作步驟

trac load mar span 必須 最可 objc copy 右鍵 原文地址:http://blog.csdn.net/vbirdbest/article/details/51122637 使用場景: 假如你的項目(這裏指的是手機客戶端項目)的某個版本(例如1.0

js 定時器用法——setTimeout()、setInterval()、clearTimeout()、clearInterval()

ntb 幫助 .get tint num 用法 -c 函數 tel 在js應用中,定時器的作用就是可以設定當到達一個時間來執行一個函數,或者每隔幾秒重復執行某段函數。這裏面涉及到了三個函數方法:setInterval()、setTimeout()、clearI

selenium用法

key url enc element api code 需要 int question selenium用法詳解 selenium主要是用來做自動化測試,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。 模擬瀏覽器進行網頁加載,當requests,url

C# ListView用法

ont 結束 server 發生 匹配 鼠標 之前 小圖標 order 一、ListView類 1、常用的基本屬性: (1)FullRowSelect:設置是否行選擇模式。(默認為false) 提示:只有在Details視圖該屬性才有意義

linux cp命令參數及用法---linux 復制文件命令cp

linux file linux cp命令參數及用法詳解---linux 復制文件命令cp [root@Linux ~]# cp [-adfilprsu] 來源檔(source) 目的檔(destination)[root@linux

Python數據類型方法簡介一————字符串的用法

python 字符串連接 字符串用法 符串是Python中的重要的數據類型之一,並且字符串是不可修改的。 字符串就是引號(單、雙和三引號)之間的字符集合。(字符串必須在引號之內,引號必須成對)註:單、雙和三引號在使用上並無太大的區別; 引號之間可以采取交叉使用的方式避免過多轉義;

C# ListView用法(轉)

分組 創建 cti 排列 checkbox 定義 com 程序 erl 一、ListView類 1、常用的基本屬性: (1)FullRowSelect:設置是否行選擇模式。(默認為false) 提示:只有在Details視圖該屬性才有

java中的instanceof用法

定義 xtend print 繼承 interface 參數 保留 如果 ack   instanceof是Java的一個二元操作符(運算符),也是Java的保留關鍵字。它的作用是判斷其左邊對象是否為其右邊類的實例,返回的是boolean類型的數據。用它來判斷某個對象是否是

@RequestMapping 用法

同時 get() turn example track find 說明 tex -h 簡介: @RequestMapping RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。

Css中路徑data:image/png;base64的用法 (轉載)

javascrip base64編碼 asc cda 文件的 color 情況 ont 背景圖片 大家可能註意到了,網頁上有些圖片的src或css背景圖片的url後面跟了一大串字符,比如: background-image:url(data:image/png;bas

global用法

global 在函數內傳遞參數1、global一般用在函數內,將外部變量參數傳遞至函數內部,用法為:<?php $name = "why"; function changeName(){ global $name; $name = "what";

java中靜態代碼塊的用法—— static用法

super關鍵字 了解 裝載 static關鍵字 super 屬於 註意 lock 自動 (一)java 靜態代碼塊 靜態方法區別一般情況下,如果有些代碼必須在項目啟動的時候就執行的時候,需要使用靜態代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化,在不創建對象的

<!CDATA[]]用法

引號 ica lap 用法 bsp mar ret message eight 所有 XML 文檔中的文本均會被解析器解析。 只有 CDATA 區段(CDATA section)中的文本會被解析器忽略。 PCDATA PCDATA 指的是被解析的字符數據(Parsed

Es6 Promise 用法

set 問題 得到 math clas promise 回調 console spa Promise是什麽?? 打印出來看看 console.dir(Promise) 這麽一看就明白了,Promise是一個構造函數,自己身上有all、reject、r

[轉] angular2-highcharts用法

ppc tip option select sel nbsp 用法詳解 points ttr 1、 使用npm安裝angular2-highcharts npm install angular2-highcharts --save 2、主模塊中引入 app.module.t