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(正則表達式, 替換內容, 字符串)
xpath解析
from lxml import etree 兩種方式使用:將html文檔變成一個對象,而後調用對象的方法去查找指定的節點 (1)本地文件 tree = etree.parse(文件名) (2)網絡文件 tree = etree.HTML(網頁字符串) ret = tree.xpath(路徑表達式) 【注】ret是一個列表 參考文獻:http:
- 經常使用表達式: /bookstore/book 選取根節點bookstore下面全部直接子節點book //book 選取全部book /bookstore//book 查找bookstore下面全部的book /bookstore/book[1] bookstore裏面的第一個book /bookstore/book[last()] bookstore裏面的最後一個book /bookstore/book[position()<3] 前兩個book //title[@lang] 全部的帶有lang屬性的title節點 //title[@lang='eng'] 全部的lang屬性值爲eng的title節點 屬性定位 //li[@id="hua"] //div[@class="song"] 層級定位&索引 //div[@id="head"]/div/div[2]/a[@class="toindex"] 【注】索引從1開始 //div[@id="head"]//a[@class="toindex"] 【注】雙斜槓表明下面全部的a節點,無論位置 邏輯運算 //input[@class="s_ipt" and @name="wd"] 模糊匹配 : contains //input[contains(@class, "s_i")] 全部的input,有class屬性,而且屬性中帶有s_i的節點 //input[contains(text(), "愛")] starts-with //input[starts-with(@class, "s")] 全部的input,有class屬性,而且屬性以s開頭 取文本 //div[@id="u1"]/a[5]/text() 獲取節點內容 //div[@id="u1"]//text() 獲取節點裏面不帶標籤的全部內容 取屬性 //div[@id="u1"]/a[5]/@href
- 代碼中使用xpath: 1.導包:from lxml import etree 2.將html文檔或者xml文檔轉換成一個etree對象,而後調用對象中的方法查找指定的節點 2.1 本地文件:tree = etree.parse(文件名) 2.2 網絡數據:tree = etree.HTML(網頁內容字符串) - 綜合練習: 需求:獲取好段子中段子的內容和做者 http:
from lxml import etree
import requests
url='http://www.haoduanzi.com/category-10_2.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
url_content=requests.get(url,headers=headers).text