爬虫---数据解析
數據解析
- 數據解析
- 網頁數據和結構
- 網頁數據格式
- 網頁結構
- 數據解析技術
- 正則表達式
- XPath與lxml解析庫
- Beautiful Soup
- JSONPath與json模塊
- json模塊介紹
數據解析
網頁數據和結構
網頁數據格式
網頁結構
數據解析技術
Python 支持網頁解析技術:正則表達式、XPath、Beautiful Soup、JSONPath
(1)針對文本的解析,正則表達式
(2)針對HTML/XML的解析,XPath、Beautiful Soup、正則表達式
(3)針對JSON的解析,JSONPath
網頁源代碼字符串–>網頁解析器–>價值數據、新URL列表
區別:
正則表達式:基于文本特征匹配或查找指定的數據,可以處理任何格式的字符串文檔,模糊匹配
XPath、Beautiful Soup基于HTML/XML文檔的層次結構來確定到達指定節點的路徑,適合處理層級比較明顯的數據
JSONPath專門用于JSON文檔的解析
正則表達式
re模塊的使用:
1.使用compile()函數將正則表達式以字符串的形式編譯為一個Pattern類型的對象。
2.通過Pattern對象提供的方法對文本進行查找或替換,得到一個處理的結果。
3.使用處理的結果提供屬性和方法獲得信息
import re
title="你好,hello,世界"#待匹配的字符串
# 創建正則表達式,用于只匹配中文
pattern=re.compile(r"[\u4e00-\u9fa5]+")
result=pattern.findall(title)
print(result)
# ['你好', '世界']
XPath與lxml解析庫
5.4.1 XPath概述
5.4.2 XPath語法
1. 節點選取
nodename 選取此節點的所有子節點
/ 從根節點選取
// 從匹配選擇的當前節點選取文檔中的節點,而不考慮他們的位置
. 選取當前節點
… 選取當前節點的父節點
@ 選取屬性
3.選取位置節點
* 匹配任何元素節點
@* 匹配任何屬性節點
node()匹配任何類型的節點
5.4.4 lmxl庫
1. Element類:XML的節點創建節點對象:root=etree.Element(‘root’)
Beautiful Soup
5.5.2 創建Beautiful Soup對象
Beautiful Soup構造方法ruxia:
def_init_(self,amrkup="",features=None,builder=None,parse_only=None,from_encoding=None,exclude_encding=None,**kwargs)
1.markup:解析的文檔字符串或文件對象2.features:解析器名稱3.builder:表指定的解析器4.from_encoding:表指定的編碼格式5.exclude——encoding:表排除的編碼格式
# 創建對象
from bs4 import BeautifulSoupsoup=BeautifulSoup(html_doc,'lxml')
5.5.3通過操作方法進行解讀搜索
1.find():查找符合條件的第一個標簽節點
2.find_all():查找所有符合條件的標簽節點,并返回一個列表
find_all=(self,anme=None,attrs={},recursive=True,text=None,
limit=None,**Kwargs)
1.name:所有名字為name的標簽,但字符串會被忽略。
#傳入字符串:soup.find_all('b')
#傳入正則表達式:
import re
for tag in soup.find_all(re.compile("^b")):print(tag.name)
# 3).傳入列表:
soup.find_all(["a","b"])
#部分輸出結果如下:
# [<b>]The Dormouse's story</b>,
JSONPath與json模塊
JSON時比XML更簡單的數據交換格式,采用完全獨立于編程語言的文本格式來存儲和表示數據
1.使用鍵值對(key:value)表示對象屬性和值;
2. , 分隔多條數據
3. {} 包含對象
4. []表示數組
1.JSON鍵值對
“name”:“JXUST”
2.JSON值
3.對象{“name”:“JXUST”,“age”:“63”}
4.數組
5.6.2JSON 與XML比較
json模塊介紹
json.loads()
import json
str_list='[1,2,3,4]'
str_dict='{"city":"贛州","name":"lj"}'
json.loads(str_list)
[1,2,3,4]
json.loads(str_dict)
{"city":"贛州","name":"lj"}
json.dumps()
import json
demo_list=[1,2,3,4]
demo_tuple=(1,2,3,4)
demo_dict={"city":"贛州","name":"lj"}
json.dumps(demo_list)
json.dumps(demo_tuple)
print(json.dumps(demo_dict))
print(json.dumps(demo_dict,ensure_ascii=False))
json.load()
import json
str_list1=json.load(open("listStr.json"))
print(str_list1)
str_dict1=json.load(open("dictStr.json"))
print(str_dict1)
json.dump()
import json
str_list2=[{"city":"贛州"},{"name":"lj"}]
json.dump(str_list2,open("listStr.json","w"),ensure_ascii=False)
demo_dict={"city":"贛州","name":"lj"}
json.dump(str_dict,open("dictStr.json","w"),ensure_ascii=False)
總結
- 上一篇: 爬虫入门
- 下一篇: Urllib库函数、代理、爬取案例