python爬蟲匹配
1.匹配分類
我們在爬蟲學習過程當中,大部分時候伺服器返回給我們的是html,我們需要從HTML當中將資料過濾出來。所以我們需要學習字串的匹配
1.1按照匹配內容進行描述
正則匹配:內容的型別和內容的長度匹配
1.2按照匹配結構進行描述
Xpath lxml:結構特徵匹配
安裝:pip install lxml
1.3綜合性的匹配
Beautifulsoup:就是可以同時進行結構和內容的匹配
安裝:pip install beautifulsoup4
2.正則匹配
正則是通過對字串內容描述來進行匹配的高階字串處理方式
簡單的匹配結構:字串的split、replace方法
2.1正則內容匹配
\d 數字
\D 非數字
\s 空格
\S 非空格
\w 數字、字母、下劃線
\W 非數字、字母、下劃線
[] 匹配當中任意一元素
[^] 匹配非當中任意一元素
| 匹配任意一邊,a或b
()
. 非換行
^ 開頭
$ 結尾
2.2正則長度匹配
* 0到多次
+ 1到多次
? 0到1次
{} 指定次 {n,m}
2.3正則匹配方法
Findall
Search
Match
(1)程式碼
(2)結果
2.4組匹配
(1)程式碼
(2)結果
2.5貪婪和反貪婪
(1)程式碼
(2)結果
爬取百度圖片提取圖片地址可使用正則
(1)程式碼
(2)結果
3.lxml匹配
lxml 是python三方的結構匹配模組, lxml是python的一個解析庫,支援HTML和XML的解析,支援XPath解析方式,而且解析效率非常高
3.1 lxml匹配步驟
1.匯入模組:
2.lxml在爬蟲匹配當中具有相當固定的套路
(1)將爬蟲獲取到的HTML字串轉換為HTML結構圖
(2)xpath匹配獲取資料
3.2 lxml匹配結果處理
text 返回匹配標籤的文字
tag 返回匹配標籤的名字
attrib 返回匹配標籤的屬性
(1)程式碼
# coding:utf-8
import requests
from lxml import etree
html = '''
<div>
<ul>
<li name="suner" class="one">suner</li>
<li name="wjk" class="two">wjk</li>
<li name="wang" class="three">wang</li>
<li name="karry" class="four">karry</li>
</ul>
</div>
'''
# lxml在爬蟲匹配當中具有相當固定的套路
# 1.將爬蟲獲取到的HTML字串轉換為HTML結構圖
HTML = etree.HTML(html)
# 2.xpath匹配獲取資料
results = HTML.xpath("//li")
for result in results:
print("==============================")
print(result)
print(result.text)
print(result.tag)
print(result.attrib)
(2)結果
3.3 lxml常用語法
3.3.1 //
// :遞迴層整個HTML裡面所有的
3.3.2 /
/ :代表HTML結構的下一層,一定是直屬的下一層,必須一層一層寫,比較繁瑣,但是是程式生成xpath的首選,我們在瀏覽器的除錯模式下可以複製到類似的xpath
瀏覽器拷貝的xpath://*[@id="qiushi_tag_121089034"]/div[2]/a/img
3.3.3 索引
[]索引(從1開始)主要用於短期快速匹配
# 匹配li標籤的第四個索引
result = HTML.xpath('//div/ul/li[4]')
3.3.4 @屬性
[@]屬性
上述匹配方式,如果頁面載入慢,或者非同步載入,或者開發者添加了一個li那匹配就失效了那麼我們用屬性精確匹配,我們在爬蟲當中首選
result = HTML.xpath('//li[@name="suner"]') 匹配name=suner的值
result = HTML.xpath('//li/@name') 匹配所有name屬性的值
4.beautifulsoup匹配
1.BeautifulSoup是Python的一個庫,最主要的功能就是從網頁匹配我們需要的資料。
2.BeautifulSoup將html解析為物件進行處理,全部頁面轉變為字典或者陣列,相對於正則表示式的方式,可以大大簡化處理過程。
3.安裝:pip3 install beautifulsoup4
Beautifulsoup和xpath的使用結構大同小異
4.1 beautifulsoup匹配步驟
1.匯入模組:
from bs4 import BeautifulSoup
4.1.1 構建beautifulsoup例項
html = '''
<html>
<head>
<title>test</title>
</head>
<body>
<div>
<ul>
<li name="suner" class="one"><a>suner</a></li>
<li name="wjk" class="two">wjk</li>
<li name="wang" class="three">wang</li>
<li name="karry" class="four">karry</li>
</ul>
</div>
</body>
</html>
'''
soup = BeautifulSoup(html,”lxml”)
(1)第一個引數是要匹配的內容
(2)第二個引數是beautifulsoup要採用的模組
# html.parser Python內建的結構匹配方法,但是效率不如lxml所以不常用
# lxml 使用 lxml模組
# xml 使用 xml模組
# html5lib 該模組可以將內容轉換HTML5物件
# 但是我們要想用以上功能就要具備對應模組,比如你用lxml就要安裝lxml
4.1.2 查詢元素的值
在bs4當中有n多種匹配方法,但是最常用的是兩種
4.1.2.1 find 查詢一次
1.find查詢
(1)程式碼
(2)結果
2.通過屬性值查詢
(1)程式碼
(2)結果
3.select查詢
(1)程式碼
(2)結果
4.1.2.2 findall 查詢所有
(1)程式碼
(2)結果
4.1.2.3 soup本身返回
(1)程式碼
(2)結果