網(wǎng)頁信息提取

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庫官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讼撒,一起剝皮案震驚了整個濱河市浑厚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌根盒,老刑警劉巖钳幅,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炎滞,居然都是意外死亡敢艰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門册赛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钠导,“玉大人,你說我怎么就攤上這事森瘪⊙业鳎” “怎么了查近?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我艳狐,道長蹭劈,這世上最難降的妖魔是什么厌处? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任侦另,我火速辦了婚禮,結(jié)果婚禮上军俊,老公的妹妹穿的比我還像新娘侥加。我一直安慰自己,他們只是感情好粪躬,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布担败。 她就那樣靜靜地躺著矗蕊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氢架。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天朋魔,我揣著相機與錄音岖研,去河邊找鬼。 笑死警检,一個胖子當著我的面吹牛孙援,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扇雕,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拓售,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镶奉?” 一聲冷哼從身側(cè)響起础淤,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哨苛,沒想到半個月后鸽凶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡建峭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年玻侥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿蒸。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凑兰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出边锁,到底是詐尸還是另有隱情姑食,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布砚蓬,位于F島的核電站矢门,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏灰蛙。R本人自食惡果不足惜祟剔,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摩梧。 院中可真熱鬧,春花似錦仅父、人聲如沸浑吟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抖拴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阿宅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工洒放, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛉鹿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓往湿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親煌茴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容