1.xpath解析
from lxml import etree 兩種方式使用:將html文檔變成一個對象,然后調用對象的方法去查找指定的節點 (1)本地文件 tree = etree.parse(文件名) ===》保存的本地文件路徑放入 (2)網絡文件 tree = etree.HTML(網頁字符串) ==》直接把得到的網頁字符串作為參數傳入 ret = tree.xpath(路徑表達式) 【注】ret是一個列表,所以要用ret需要對之進行處理
- 安裝xpath插件:可以在插件中直接執行xpath表達式
1.將xpath插件拖動到谷歌瀏覽器拓展程序(更多工具)中,安裝成功
2.啟動和關閉插件 ctrl + shift + x
常用的一些xpath表達式
1 /bookstore/book 選取根節點bookstore下面所有直接子節點book 2 //book 選取所有book 3 /bookstore//book 查找bookstore下面所有的book 4 /bookstore/book[1] bookstore里面的第一個book 5 /bookstore/book[last()] bookstore里面的最后一個book 6 /bookstore/book[position()<3] 前兩個book 7 //title[@lang] 所有的帶有lang屬性的title節點 8 //title[@lang='eng'] 所有的lang屬性值為eng的title節點 9 屬性定位 10 //li[@id="hua"] 11 //div[@class="song"] 12 層級定位&索引 13 //div[@id="head"]/div/div[2]/a[@class="toindex"] 14 【注】索引從1開始 15 //div[@id="head"]//a[@class="toindex"] 16 【注】雙斜杠代表下面所有的a節點,不管位置 17 邏輯運算 18 //input[@class="s_ipt" and @name="wd"] 19 模糊匹配 : 20 contains 21 //input[contains(@class, "s_i")] 22 所有的input,有class屬性,並且屬性中帶有s_i的節點 23 //input[contains(text(), "愛")] 24 starts-with 25 //input[starts-with(@class, "s")] 26 所有的input,有class屬性,並且屬性以s開頭 27 取文本 28 //div[@id="u1"]/a[5]/text() 獲取節點內容 29 //div[@id="u1"]//text() 獲取節點里面不帶標簽的所有內容 30 取屬性 31 //div[@id="u1"]/a[5]/@href
綜合練習:獲取好段子中的內容和作者
1 from lxml import etree 2 import requests 3 4 url='http://www.haoduanzi.com/category-10_2.html' 5 headers = { 6 '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', 7 } 8 url_content=requests.get(url,headers=headers).text 9 #使用xpath對url_conten進行解析 10 #使用xpath解析從網絡上獲取的數據 11 tree=etree.HTML(url_content) 12 #解析獲取當頁所有段子的標題 13 title_list=tree.xpath('//div[@class="log cate10 auth1"]/h3/a/text()') 14 15 ele_div_list=tree.xpath('//div[@class="log cate10 auth1"]') 16 17 text_list=[] #最終會存儲12個段子的文本內容 18 for ele in ele_div_list: 19 #段子的文本內容(是存放在list列表中) 20 text_list=ele.xpath('./div[@class="cont"]//text()') 21 #list列表中的文本內容全部提取到一個字符串中 22 text_str=str(text_list) 23 #字符串形式的文本內容防止到all_text列表中 24 text_list.append(text_str) 25 print(title_list) 26 print(text_list)
2.bs4解析
安裝:
- 需要將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
簡單實用規則
1 - from bs4 import BeautifulSoup 2 - 使用方式:可以將一個html文檔,轉化為BeautifulSoup對象,然后通過對象的方法或者屬性去查找指定的內容 3 (1)轉化本地文件: 4 - soup = BeautifulSoup(open('本地文件'), 'lxml') 5 (2)轉化網絡文件: 6 - soup = BeautifulSoup('字符串類型或者字節類型', 'lxml') 7 (3)打印soup對象顯示內容為html文件中的內容 8 (1)根據標簽名查找 9 - soup.a 只能找到第一個符合要求的標簽 10 (2)獲取屬性 11 - soup.a.attrs 獲取a所有的屬性和屬性值,返回一個字典 12 - soup.a.attrs['href'] 獲取href屬性 13 - soup.a['href'] 也可簡寫為這種形式 14 (3)獲取內容 15 - soup.a.string 16 - soup.a.text 17 - soup.a.get_text() 18 【注意】如果標簽還有標簽,那么string獲取到的結果為None,而其它兩個,可以獲取文本內容 19 (4)find:找到第一個符合要求的標簽 20 - soup.find('a') 找到第一個符合要求的 21 - soup.find('a', title="xxx") 22 - soup.find('a', alt="xxx") 23 - soup.find('a', class_="xxx") 24 - soup.find('a', id="xxx") 25 (5)find_all:找到所有符合要求的標簽 26 - soup.find_all('a') 27 - soup.find_all(['a','b']) 找到所有的a和b標簽 28 - soup.find_all('a', limit=2) 限制前兩個 29 (6)select:soup.select('#feng') 30 - 根據選擇器選擇指定的內容 31 - 常見的選擇器:標簽選擇器(a)、類選擇器(.)、id選擇器(#)、層級選擇器 32 - 層級選擇器: 33 div .dudu #lala .meme .xixi 下面好多級 34 div > p > a > .lala 只能是下面一級 35 【注意】select選擇器返回永遠是列表,需要通過下標提取指定的對象
- 綜合練習:
需求:使用bs4實現將詩詞名句網站中三國演義小說的每一章的內容爬去到本地磁盤進行存儲
http://www.shicimingju.com/book/sanguoyanyi.html
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import requests 4 from bs4 import BeautifulSoup 5 6 headers={ 7 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 8 } 9 def parse_content(url): 10 #獲取標題正文頁數據 11 page_text = requests.get(url,headers=headers).text 12 soup = BeautifulSoup(page_text,'lxml') 13 #解析獲得標簽 14 ele = soup.find('div',class_='chapter_content') 15 content = ele.text #獲取標簽中的數據值 16 return content 17 18 if __name__ == "__main__": 19 url = 'http://www.shicimingju.com/book/sanguoyanyi.html' 20 reponse = requests.get(url=url,headers=headers) 21 page_text = reponse.text 22 23 #創建soup對象 24 soup = BeautifulSoup(page_text,'lxml') 25 #解析數據 26 a_eles = soup.select('.book-mulu > ul > li > a') 27 print(a_eles) 28 cap = 1 29 for ele in a_eles: 30 print('開始下載第%d章節'%cap) 31 cap+=1 32 title = ele.string 33 content_url = 'http://www.shicimingju.com'+ele['href'] 34 content = parse_content(content_url) 35 36 with open('./sanguo.txt','w') as fp: 37 fp.write(title+":"+content+'\n\n\n\n\n') 38 print('結束下載第%d章節'%cap)