Python網絡爬蟲的三種數據解析方式

Python網絡爬蟲的三種數據解析方式

一.正解解析

常用正則表達式回顧:

單字符:

. : 除換行以外所有字符

[] :[aoe] [a-w] 匹配集合中任意一個字符

\d :數字 [0-9]

\D : 非數字

\w :數字、字母、下劃線、中文

\W : 非\w

\s :所有的空白字符包,括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。

\S : 非空白

數量修飾:

* : 任意多次 >=0

+ : 至少1次 >=1

? : 可有可無 0次或者1次

{m} :固定m次 hello{3,}

{m,} :至少m次

{m,n} :m-n次

邊界:

$ : 以某某結尾

^ : 以某某開頭

分組:

(ab)

貪婪模式: .*

非貪婪(惰性)模式: .*?

re.I : 忽略大小寫

re.M :多行匹配

re.S :單行匹配

re.sub(正則表達式, 替換內容, 字符串)

回顧練習:


Python網絡爬蟲的三種數據解析方式


項目需求:爬取糗事百科指定頁面的糗圖,並將其保存到指定文件夾中


Python網絡爬蟲的三種數據解析方式


二.Xpath解析

測試頁面數據


Python網絡爬蟲的三種數據解析方式


常用xpath表達式回顧

屬性定位:

#找到class屬性值為song的div標籤

//div[@class="song"]

層級&索引定位:

#找到class屬性值為tang的div的直系子標籤ul下的第二個子標籤li下的直系子標籤a

//div[@class="tang"]/ul/li[2]/a

邏輯運算:

#找到href屬性值為空且class屬性值為du的a標籤

//a[@href="" and @class="du"]

模糊匹配:

//div[contains(@class, "ng")]

//div[starts-with(@class, "ta")]

取文本:

# /表示獲取某個標籤下的文本內容

# //表示獲取某個標籤下的文本內容和所有子標籤下的文本內容

//div[@class="song"]/p[1]/text()

//div[@class="tang"]//text()

取屬性:

//div[@class="tang"]//li[2]/a/@href

代碼中使用xpath表達式進行數據解析:

1.下載:pip install lxml

2.導包:from lxml import etree

3.將html文檔或者xml文檔轉換成一個etree對象,然後調用對象中的方法查找指定的節點

2.1 本地文件:tree = etree.parse(文件名)

tree.xpath("xpath表達式")

2.2 網絡數據:tree = etree.HTML(網頁內容字符串)

tree.xpath("xpath表達式")

安裝xpath插件在瀏覽器中對xpath表達式進行驗證:可以在插件中直接執行xpath表達式

將xpath插件拖動到谷歌瀏覽器拓展程序(更多工具)中,安裝成功

啟動和關閉插件 ctrl + shift + x

項目需求:獲取好段子中段子的內容和作者 http://www.haoduanzi.com


Python網絡爬蟲的三種數據解析方式


下載煎蛋網中的圖片數據:http://jandan.net/ooxx


Python網絡爬蟲的三種數據解析方式


三.BeautifulSoup解析

環境安裝

- 需要將pip源設置為國內源,阿里源、豆瓣源、網易源等

- windows

(1)打開文件資源管理器(文件夾地址欄中)

(2)地址欄上面輸入 %appdata%

(3)在這裡面新建一個文件夾 pip

(4)在pip文件夾裡面新建一個文件叫做 pip.ini ,內容寫如下即可

[global]

timeout = 6000

index-url = https://mirrors.aliyun.com/pypi/simple/

trusted-host = mirrors.aliyun.com

- linux

(1)cd ~

(2)mkdir ~/.pip

(3)vi ~/.pip/pip.conf

(4)編輯內容,和windows一模一樣

- 需要安裝:pip install bs4

bs4在使用時候需要一個第三方庫,把這個庫也安裝一下

pip install lxml

基礎使用

使用流程:

- 導包:from bs4 import BeautifulSoup

- 使用方式:可以將一個html文檔,轉化為BeautifulSoup對象,然後通過對象的方法或者屬性去查找指定的節點內容

(1)轉化本地文件:

- soup = BeautifulSoup(open('本地文件'), 'lxml')

(2)轉化網絡文件:

- soup = BeautifulSoup('字符串類型或者字節類型', 'lxml')

(3)打印soup對象顯示內容為html文件中的內容

基礎鞏固:

(1)根據標籤名查找

- soup.a 只能找到第一個符合要求的標籤

(2)獲取屬性

- soup.a.attrs 獲取a所有的屬性和屬性值,返回一個字典

- soup.a.attrs['href'] 獲取href屬性

- soup.a['href'] 也可簡寫為這種形式

(3)獲取內容

- soup.a.string

- soup.a.text

- soup.a.get_text()

【注意】如果標籤還有標籤,那麼string獲取到的結果為None,而其它兩個,可以獲取文本內容

(4)find:找到第一個符合要求的標籤

- soup.find('a') 找到第一個符合要求的

- soup.find('a', title="xxx")

- soup.find('a', alt="xxx")

- soup.find('a', class_="xxx")

- soup.find('a', id="xxx")

(5)find_all:找到所有符合要求的標籤

- soup.find_all('a')

- soup.find_all(['a','b']) 找到所有的a和b標籤

- soup.find_all('a', limit=2) 限制前兩個

(6)根據選擇器選擇指定的內容

select:soup.select('#feng')

- 常見的選擇器:標籤選擇器(a)、類選擇器(.)、id選擇器(#)、層級選擇器

- 層級選擇器:

div .dudu #lala .meme .xixi 下面好多級

div > p > a > .lala 只能是下面一級

【注意】select選擇器返回永遠是列表,需要通過下標提取指定的對象

需求:使用bs4實現將詩詞名句網站中三國演義小說的每一章的內容爬去到本地磁盤進行存儲 http://www.shicimingju.com/book/sanguoyanyi.html


Python網絡爬蟲的三種數據解析方式


相關推薦

推薦中...