Beautifulsoup庫簡介
在介紹使用css選擇器之前羹应,我們先來了解一下要與其配合使用的Beautifulsoup庫
Beautiful Soup 是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫.它能夠通過你喜歡的轉(zhuǎn)換器實現(xiàn)慣用的文檔導(dǎo)航,查找,修改文檔的方式.Beautiful Soup會幫你節(jié)省數(shù)小時甚至數(shù)天的工作時間.
安裝
Beautifulsoup庫的安裝和requests庫的安裝類似,只要在命令行中用pip命令就可以了
$ pip install beautifulsoup4
Beautifulsoup庫的使用
還是以百度首頁為例缔莲,我們先用requests庫的get方法獲得頁面
import requests
# 從bs4庫中導(dǎo)入Beautifulsoup類
from bs4 import BeautifulSoup
url = "http://www.baidu.com"
r = requests.get(url)
r.encoding = 'utf-8'
# 用一個變量來保存爬到的頁面
html = r.text
# 使用‘lxml HTML’作為解釋器解析HTML
soup = BeautifulSoup(html, 'lxml')
# 格式化輸出
print(soup.prettify())
# result
# <html>
# <head>
# <meta content="text/html;charset=utf-8" http-equiv="content-type"/>
# <meta content="IE=Edge" http-equiv="X-UA-Compatible"/>
# <meta content="always" name="referrer"/>
# <link rel="stylesheet" type="text/css"/>
# <title>
# 百度一下唱较,你就知道
# </title>
# </head>
# <body link="#0000cc">
# <div id="wrapper">
# <div id="head">
# <div class="head_wrapper">
# ... ...
可以看到扎唾,用Beautifulsoup庫解析之后的HTML被轉(zhuǎn)換成了標簽樹,標簽樹的每一個節(jié)點都是一個python對象南缓,因此我們就可以很方便地對標簽樹進行操作胸遇。
CSS選擇器
CSS選擇器是一種單獨的文檔搜索語法。Beautiful Soup支持大部分的CSS選擇器汉形,Tag和Beautifulsoup對象的.select()
方法可以通過傳入字符串參數(shù)找到對應(yīng)的標簽纸镊。
例如我們要找title標簽:
title = soup.select("title")
print(title)
# [<title>百度一下,你就知道</title>]
也可以通過標簽逐層查找:
title = soup.select('html head title')
print(title)
# [<title>百度一下概疆,你就知道</title>]
直接子標簽查找:
a = soup.select('p > a')
print(a)
'''
[<a >關(guān)于百度</a>,
<a >About Baidu</a>,
<a >使用百度前必讀</a>,
<a class="cp-feedback" >意見反饋</a>]
'''
通過類名和id查找:
# 查找class='lb'的標簽
print(soup.select('.lb'))
# 查找id='cp'的標簽
print(soup.select('#cp'))
'''
[<a class="lb" name="tj_login">登錄</a>]
[<p id="cp">?2017 Baidu <a >使用百度前必讀</a> <a class="cp-feedback" >意見反饋</a> 京ICP證030173號 <img src="http://www.baidu.com/img/gs.gif"/> </p>]
'''
除了以上的一些基本的查找方法外逗威,還有組合查找、屬性查找岔冀、語言設(shè)置查找等凯旭,可以參看官方文檔中關(guān)于選擇器的一節(jié)
正則表達式
正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")罐呼。
正則表達式使用單個字符串來描述鞠柄、匹配一系列匹配某個句法規(guī)則的字符串。
簡單來說弄贿,正則表達式是用來簡潔表達一組字符串的表達式春锋。
舉個簡單的例子,比如你要匹配字符串中的'PY''PYY''PYYYY'......'PYYYYYYYY...'差凹,它們對應(yīng)的正則表達式就是'PY+'
總的來說期奔,正則表達式是
- 通用的字符串表達框架
- 簡潔表達一組字符串的表達式
- 針對字符串表達’簡潔‘和’特征’思想的工具
- 判斷某字符串的特征歸屬
正則表達式描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串危尿、將匹配的子串替換或者從某個串中取出符合某個條件的子串等呐萌。
正則表達式由字符和操作符構(gòu)成
常用的操作符
操作符 | 說明 |
---|---|
. | 表示任何單個字符 |
[] | 字符集,對單個字符給出取值范圍 |
[^] | 非字符集谊娇,對單個字符給出排除范圍 |
* | 前一個字符的0次或無限次擴展 |
+ | 前一個字符的1次或無限次擴展 |
? | 前一個字符的0次或1次擴展 |
| | 左右表達式的任意一個 |
{m} | 擴展前一個字符m次 |
{m,n} | 擴展前一個字符m次到n次(包含) |
^ | 匹配字符串開始 |
$ | 匹配字符串結(jié)尾 |
() | 分組標記肺孤,內(nèi)部只能使用| |
\d | 數(shù)字,等價于[0-9] |
\w | 單詞字符济欢,等價于[A-Zz-z0-9_] |
一些實例
正則表達式 | 對應(yīng)字符串 |
---|---|
P(Y|YT|YTH|YTHO)?N | 'PN', 'PYN', 'PYTN', 'PYTHN', 'PYTHON' |
PYTHON+ | 'PYTHON', 'PYTHONN',......,'PYTHONNN......' |
PYTH[ON] | 'PYTHO', 'PYTHN' |
PYTH{1,3}ON | 'PYTHON', 'PYTHHON', 'PYTHHHON' |
^[A-Za-z]+$ | 匹配由26個字母組成的字符串 |
^-?\d+$ | 匹配整數(shù)字符串 |
[1-9]\d{5} | 中國境內(nèi)郵政編碼 |
[\u4e00-\u9fa5] | 匹配中文字符 |
Re庫
re庫是python中用于正則表達式匹配操作的標準庫赠堵,不需要安裝,可以直接通過import re
導(dǎo)入
re庫采用的是原生字符串類型來表示正則表達式法褥,原生字符串特點就是字符串中的‘\’不被解釋為轉(zhuǎn)義符茫叭,表示原生字符串只需要在字符串前面加上r就可以了
re庫的主要功能函數(shù):
函數(shù) | 說明 |
---|---|
re.search() | 在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象 |
re.match() | 從一個字符串的開始位置起匹配正則表達式半等,返回match對象 |
re.findall() | 搜索字符串揍愁,以列表類型返回全部能匹配的子串 |
re.split() | 將一個字符串按照正則表達式匹配結(jié)果進行分割,返回列表類型 |
re.finditer() | 搜索字符串杀饵,返回一個匹配結(jié)果的迭代類型莽囤,每個迭代元素是match對象 |
re.sub() | 在一個字符串中替換所有匹配正則表達式的子串,返回替換后的字符串 |
re.match(pattern, string, flags=0)
? pattern : 正則表達式的字符串或原生字符串表示
? string : 待匹配字符串
? flags : 正則表達式使用時的控制標記
match()和search()的區(qū)別在于切距,match方法是從字符串的起始位置開始匹配朽缎,如果有一個字符不同便結(jié)束匹配,返回None
谜悟;而search方法則是搜索整個字符串匹配符合規(guī)則的子串饵沧,以下是兩種方法的比較
import re
re.search(r'b', 'abcba') # <_sre.SRE_Match object; span=(1, 2), match='b'>
re.match(r'b', 'abcba') # no match
re.search(r'a', 'abcba') # <_sre.SRE_Match object; span=(0, 1), match='a'>
re.match(r'a', 'abcba') # <_sre.SRE_Match object; span=(0, 1), match='a'>
如果匹配成功,返回的是一個match對象赌躺,其中包含很多信息
match對象的屬性和方法
屬性 | 說明 | 方法 | 說明 |
---|---|---|---|
.string | 待匹配的文本 | .group(0) | 獲得匹配后的字符串 |
.re | 匹配時使用的patter對象(正則表達式) | .start() | 匹配字符串在原始字符串的開始位置 |
.pos | 正則表達式搜索文本的開始位置 | .end() | 匹配字符串在原始字符串的結(jié)束位置 |
.endpos | 正則表達式搜索文本的結(jié)束位置 | .span() | 返回(.start(), .end()) |
re.findall(pattern, string, flags=0)
findall方法返回的是所有符合匹配規(guī)則的字符串組成的列表,順序是根據(jù)字符串從左到右
re.split(pattern, string, maxsplit=0, flags=0)
根據(jù)pattern的出現(xiàn)拆分字符串羡儿。如果在pattern中使用捕獲括號礼患,則模式中所有組的文本也會作為結(jié)果列表的一部分返回。maxsplit表示最大分割數(shù),如果maxsplit不為零缅叠,則至多出現(xiàn)maxsplit分裂悄泥,并且字符串的其余部分作為列表的最后一個元素返回。
import re
re.split(r'b', 'abcba') # ['a', 'c', 'a']
re.split(r'(b)', 'abcba') # ['a', 'b', 'c', 'b', 'a']
re.split(r'b', 'abcba', 1) # ['a', 'cba']
re.split(r'(b)', 'abcba', 1) # ['a', 'b', 'cba']
re.finditer(pattern, string, flags=0)
與findall方法作用相同肤粱,只不過是以迭代器的形式返回
re.sub(pattern, repl, string, count=0, flags=0)
· repl:替換匹配字符串的字符串
? count : 匹配的最大替換次數(shù),為0時替換全部
將string中最左側(cè)非重疊出現(xiàn)的pattern替換為repl弹囚,返回所獲得的字符串。如果未找到該模式领曼,則字符串將保持不變鸥鹉。repl 可以是一個字符串或一個函數(shù)
import re
re.sub(r'b','d','abcba') # 'adcda'
re.sub(r'b','d','abcba', 1) # 'adcba'
flags
可以看到之前所以的函數(shù)中都有一個參數(shù)flags
,它是用來配置正則表達式的匹配模式的庶骄。
取值可以使用按位或運算符
|
表示同時生效毁渗,比如re.I | re.M
。(來自靜覓)
-
re.I
(全拼:IGNORECASE): 忽略大小寫(括號內(nèi)是完整寫法单刁,下同) -
re.M
(全拼:MULTILINE): 多行模式灸异,改變’^’和’$’的行為 -
re.S
(全拼:DOTALL): 點任意匹配模式,改變’.’的行為 -
re.L
(全拼:LOCALE): 使預(yù)定字符類 \w \W \b \B \s \S 取決于當前區(qū)域設(shè)定 -
re.U
(全拼:UNICODE): 使預(yù)定字符類 \w \W \b \B \s \S \d \D 取決于unicode定義的字符屬性 -
re.X
(全拼:VERBOSE): 詳細模式羔飞。這個模式下正則表達式可以是多行肺樟,忽略空白字符,并可以加入注釋逻淌。
Chrome開發(fā)者工具
如何調(diào)出Chrome開發(fā)者工具
- 按F12打開
- 單擊右鍵么伯,在菜單中點擊“檢查”打開
常用面板模塊
- 元素(Elements)
- 網(wǎng)絡(luò)(Network)
這里只介紹在寫爬蟲時可能會用到的兩個功能模塊,如果想了解其他的可以在網(wǎng)上找詳細的教程
元素(Element)
單擊Element標簽頁恍风,頁面左邊顯示的是HTML的結(jié)構(gòu)蹦狂,右邊是選中元素的全部屬性
- 鼠標移到某個元素上,頁面視圖上對應(yīng)的地方會變成藍色背景朋贬,可以用于定位元素對應(yīng)的源代碼凯楔。
- 選中一個元素,在底部可以看到該元素在HTML結(jié)構(gòu)中的位置關(guān)系
- 右鍵一個元素可以對其進行修改锦募,菜單從上到下依次是
- Add attribute : 為該元素添加屬性
- Edit attribute:修改該元素的屬性
- Delete element:刪除元素
- Copy:復(fù)制元素的一些信息摆屯,移到上面會顯示二級菜單
- ... ...
- 寫某個元素的CSS選擇器的時候,可以右鍵該元素糠亩,copy selector(有些版本叫CSS path或者CSS selector)
右側(cè)顯示的是選中元素的CSS屬性虐骑,在Styles可以對CSS屬性進行修改,刪除和添加赎线,僅對當前顯示的頁面生效廷没,不會影響到源代碼。
網(wǎng)絡(luò)(Network)
Network是一個監(jiān)控當前網(wǎng)頁所有的http請求的面版垂寥,它主體部分展示的是每個http請求颠黎,每個字段表示著該請求的不同屬性和狀態(tài)
- name:請求的文件名稱
- status:狀態(tài)代碼
- type:文件類型
- initiator:請求源
- time:請求的時間
- waterfall:請求發(fā)送過程的狀態(tài)軸
當你按F5刷新頁面的時候另锋,可以看到最中間的的時間軸上花花綠綠的一條條線顯示出來。這個記錄的是頁面在加載過程中所有的請求發(fā)出的時間和過程狭归,你可以用鼠標選擇一段時間夭坪,來觀察這一段時間發(fā)出的請求內(nèi)容
單擊Name一列任意一個請求的文件名,則會跳出這個請求對應(yīng)的參數(shù)header(表頭信息过椎、返回信息室梅、請求基本狀態(tài)等),Preview(返回的格式化轉(zhuǎn)移后文本信息)疚宇、response(轉(zhuǎn)移之前的原始信息)亡鼠、Cookies(該請求帶的cookies)、Timing(請求時間變化)灰嫉。這些東西可以用來分析請求拆宛,在講反爬蟲的時候我們會深入介紹。
參考資料:
Beautifulsoup庫官方文檔
re庫官方文檔