Python網絡爬蟲——BeautifulSoup4庫的使用

使用requests庫獲取html頁面並將其轉換成字符串以後,須要進一步解析html頁面格式,提取有用信息。html

BeautifulSoup4庫,也被成爲bs4庫(後皆採用簡寫)用於解析和處理html和xml。python

1.調用web

bs4庫中最主要的即是bs類了,每一個實例化的對象都至關於一個html頁面json

須要採用from-import導入bs類,同時經過BeautifulSoup()建立一個bs對象spa

代碼以下:3d

import requests
from bs4 import BeautifulSoup
r=requests.get("https://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)
print(type(soup))

 

運行結果:code

 

 2.經常使用屬性xml

建立的BeautifulSoup對象是一個樹形結構,它包含html頁面中的每個Tag(標籤)元素,能夠經過<a>.<b>的形式得到htm

常見的屬性以下:對象

head:

html頁面<head>內容

title:

html頁面標題,在<head>之中,由<title>標記

body:

html頁面<body>內容

p:

html頁面第一個<p>內容

strings:

html頁面全部呈如今web上的字符串,即標籤的內容

stripped_string:

html頁面全部呈如今web上的非空字符串

 

 

接下來嘗試爬取百度的標語「百度一下,你就知道」

首先咱們經過requests來創建請求,能夠經過查看源代碼找到對應部分

以下所示:

 

 因此直接經過調用<title>標籤便可

代碼以下:

import requests
from bs4 import BeautifulSoup
r=requests.get("https://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)
title=soup.title
print(title)

 

結果如圖所示:

 

  3.標籤經常使用屬性

每個標籤在bs4中也是一個對象,被稱爲tag對象,以糯米爲例,常見結構以下:

<a class=「mnav」 href="http://www.nuomi.com">糯米</a>

其中尖括號(<>)中標籤的名字爲 name,其餘項爲attrs,尖括號之間的內容爲string

因此常見的標籤屬性分爲4種

name:

字符串、標籤的名字

attrs:

字典、包含了原來頁面tag的全部屬性,好比href

contrnts:

列表、tag下全部子tag的內容

string:

字符串、tag所包含的文本,網頁中的真實文字

 

因爲html能夠在標籤中嵌套其餘的標籤,因此string返回遵循如下原則

①若是標籤內沒有其餘標籤,string屬性返回其中的內容

②若是標籤內部還有標籤,但只有一個標籤,string返回最裏面的標籤內容

③若是內部超過1層嵌套標籤,則返回爲none

 

依然以百度爲例,咱們須要找到第一個<a>標籤的string代碼應當以下:

import requests
from bs4 import BeautifulSoup
r=requests.get("https://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)
print(soup.a.string)

 

結果如圖所示:

 

 4.調用find()與find_all()

html中,同一個特標籤會有不少內容,好比百度首頁<a>一共有13處,但值返回第一處

因此這時候須要經過find與find_all來尋找,這兩個方法都會遍歷html文檔按照條件返回內容

使用方法以下:

BeautifulSoup.find_all(name,attrs,recursive,string,limit)

name:以標籤名字進行搜索,名字用字符串類型表示

attrs:按照標籤的屬性來搜索,須要列出屬性的名字和值,用json方法表示

recursive:設置查找層次,只查找當前標籤的西一層時使用recursiv=false

string:按照關鍵字查找string屬性內容,採用string=開始

limit:返回結果個數,默認所有

至於find()使用方法如find_all()相同,

BeautifulSoup.find_all(name,attrs,recursive,string)

區別在於find()只搜索第一個結果,find_all()返回全部結果。

 

咱們嘗試來經過find_all()來獲取全部含有「百度」這一關鍵詞的標籤

首先須要調用re庫,re是python的標準庫能夠採用compile()對字符串的檢索

因此代碼以下:

import requests
import re
from bs4 import BeautifulSoup
r=requests.get("https://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)
w=soup.find_all(string=re.compile("百度"))
print(w)

 

結果以下:

相關文章
相關標籤/搜索