爬蟲的兩種解析方式 xpath和bs4


1.xpath解析

from lxml import etree 兩種方式使用:將html文檔變成一個對象,然后調用對象的方法去查找指定的節點 (1)本地文件 tree = etree.parse(文件名)  ===》保存的本地文件路徑放入 (2)網絡文件 tree = etree.HTML(網頁字符串) ==》直接把得到的網頁字符串作為參數傳入 ret = tree.xpath(路徑表達式) 【注】ret是一個列表,所以要用ret需要對之進行處理

  參考文獻:w3c  xpath

  - 安裝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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM