成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

四種Python爬蟲常用的定位元素方法對比,你偏愛哪一款?

開發 后端
在使用Python本爬蟲采集數據時,一個很重要的操作就是如何從請求到的網頁中提取數據,而正確定位想要的數據又是第一步操作。

在使用Python本爬蟲采集數據時,一個很重要的操作就是如何從請求到的網頁中提取數據,而正確定位想要的數據又是第一步操作。

本文將對比幾種 Python 爬蟲中比較常用的定位網頁元素的方式供大家學習:

  • 傳統 BeautifulSoup 操作
  • 基于 BeautifulSoup 的 CSS 選擇器(與 PyQuery 類似)
  • XPath
  • 正則表達式

參考網頁是當當網圖書暢銷總榜:

http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1

我們以獲取第一頁 20 本書的書名為例。先確定網站沒有設置反爬措施,是否能直接返回待解析的內容:

  1. import requests 
  2.  
  3. url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' 
  4. response = requests.get(url).text 
  5. print(response) 

仔細檢查后發現需要的數據都在返回內容中,說明不需要特別考慮反爬舉措

審查網頁元素后可以發現,書目信息都包含在 li 中,從屬于 class 為 bang_list clearfix bang_list_mode 的 ul 中

進一步審查也可以發現書名在的相應位置,這是多種解析方法的重要基礎

1. 傳統 BeautifulSoup 操作

經典的 BeautifulSoup 方法借助 from bs4 import BeautifulSoup,然后通過 soup = BeautifulSoup(html, "lxml") 將文本轉換為特定規范的結構,利用 find 系列方法進行解析,代碼如下:

  1. import requests 
  2. from bs4 import BeautifulSoup 
  3.  
  4. url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' 
  5. response = requests.get(url).text 
  6.  
  7. def bs_for_parse(response): 
  8.     soup = BeautifulSoup(response, "lxml") 
  9.     li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li') # 鎖定ul后獲取20個li 
  10.     for li in li_list: 
  11.         title = li.find('div', class_='name').find('a')['title'] # 逐個解析獲取書名 
  12.         print(title) 
  13.  
  14. if __name__ == '__main__': 
  15.     bs_for_parse(response) 

成功獲取了 20 個書名,有些書面顯得冗長可以通過正則或者其他字符串方法處理,本文不作詳細介紹

2. 基于 BeautifulSoup 的 CSS 選擇器

這種方法實際上就是 PyQuery 中 CSS 選擇器在其他模塊的遷移使用,用法是類似的。關于 CSS 選擇器詳細語法可以參考:http://www.w3school.com.cn/cssref/css_selectors.asp由于是基于 BeautifulSoup 所以導入的模塊以及文本結構轉換都是一致的:

  1. import requests 
  2. from bs4 import BeautifulSoup 
  3.  
  4. url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' 
  5. response = requests.get(url).text 
  6.          
  7. def css_for_parse(response): 
  8.     soup = BeautifulSoup(response, "lxml")  
  9.     print(soup) 
  10.  
  11. if __name__ == '__main__': 
  12.     css_for_parse(response) 

然后就是通過 soup.select 輔以特定的 CSS 語法獲取特定內容,基礎依舊是對元素的認真審查分析:

  1. import requests 
  2. from bs4 import BeautifulSoup 
  3. from lxml import html 
  4.  
  5. url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' 
  6. response = requests.get(url).text 
  7.          
  8. def css_for_parse(response): 
  9.     soup = BeautifulSoup(response, "lxml") 
  10.     li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li') 
  11.     for li in li_list: 
  12.         title = li.select('div.name > a')[0]['title'] 
  13.         print(title) 
  14.  
  15. if __name__ == '__main__': 
  16.     css_for_parse(response) 

3. XPath

XPath 即為 XML 路徑語言,它是一種用來確定 XML 文檔中某部分位置的計算機語言,如果使用 Chrome 瀏覽器建議安裝 XPath Helper 插件,會大大提高寫 XPath 的效率。

之前的爬蟲文章基本都是基于 XPath,大家相對比較熟悉因此代碼直接給出:

  1. import requests 
  2. from lxml import html 
  3.  
  4. url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' 
  5. response = requests.get(url).text 
  6.  
  7. def xpath_for_parse(response): 
  8.     selector = html.fromstring(response) 
  9.     books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li") 
  10.     for book in books: 
  11.         title = book.xpath('div[@class="name"]/a/@title')[0] 
  12.         print(title) 
  13.  
  14. if __name__ == '__main__': 
  15.     xpath_for_parse(response) 

4. 正則表達式如果對 HTML 語言不熟悉,那么之前的幾種解析方法都會比較吃力。這里也提供一種萬能解析大法:正則表達式,只需要關注文本本身有什么特殊構造文法,即可用特定規則獲取相應內容。依賴的模塊是 re

首先重新觀察直接返回的內容中,需要的文字前后有什么特殊:

  1. import requests 
  2. import re 
  3.  
  4. url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' 
  5. response = requests.get(url).text 
  6. print(response) 

觀察幾個數目相信就有答案了:<div class="name"><a href="http://product.dangdang.com/xxxxxxxx.html" target="_blank" title="xxxxxxx">

書名就藏在上面的字符串中,蘊含的網址鏈接中末尾的數字會隨著書名而改變。

分析到這里正則表達式就可以寫出來了:

  1. import requests 
  2. import re 
  3.  
  4. url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' 
  5. response = requests.get(url).text 
  6.  
  7. def re_for_parse(response): 
  8.     reg = '<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">' 
  9.     for title in re.findall(reg, response): 
  10.         print(title) 
  11.  
  12. if __name__ == '__main__': 
  13.     re_for_parse(response) 

可以發現正則寫法是最簡單的,但是需要對于正則規則非常熟練。所謂正則大法好!

當然,不論哪種方法都有它所適用的場景,在真實操作中我們也需要在分析網頁結構來判斷如何高效的定位元素,最后附上本文介紹的四種方法的完整代碼,大家可以自行操作一下來加深體會

  1. import requests 
  2. from bs4 import BeautifulSoup 
  3. from lxml import html 
  4. import re 
  5.  
  6. url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' 
  7. response = requests.get(url).text 
  8.  
  9. def bs_for_parse(response): 
  10.     soup = BeautifulSoup(response, "lxml") 
  11.     li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li') 
  12.     for li in li_list: 
  13.         title = li.find('div', class_='name').find('a')['title'] 
  14.         print(title) 
  15.  
  16. def css_for_parse(response): 
  17.     soup = BeautifulSoup(response, "lxml") 
  18.     li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li') 
  19.     for li in li_list: 
  20.         title = li.select('div.name > a')[0]['title'] 
  21.         print(title) 
  22.  
  23. def xpath_for_parse(response): 
  24.     selector = html.fromstring(response) 
  25.     books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li") 
  26.     for book in books: 
  27.         title = book.xpath('div[@class="name"]/a/@title')[0] 
  28.         print(title) 
  29.  
  30. def re_for_parse(response): 
  31.     reg = '<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">' 
  32.     for title in re.findall(reg, response): 
  33.         print(title) 
  34.  
  35. if __name__ == '__main__': 
  36.     # bs_for_parse(response) 
  37.     # css_for_parse(response) 
  38.     # xpath_for_parse(response) 
  39.     re_for_parse(response) 

 

責任編輯:趙寧寧 來源: 早起Python
相關推薦

2024-02-21 23:40:56

2015-08-24 09:21:27

類型程序員

2020-01-13 15:24:22

框架SparkHadoop

2019-01-02 13:34:13

Python IDEGeditEclipse

2020-08-03 08:32:38

Windows軟件辦公

2019-08-13 09:00:24

REST API身份認證密鑰

2021-03-10 10:13:39

爬蟲Python代碼

2024-11-28 09:06:52

2015-02-13 09:47:27

華為認證思科認證

2022-10-09 10:11:30

Python爬蟲神器

2025-01-21 00:00:00

權限模型RBAC

2017-09-21 13:04:35

數據挖掘分析分析方法數據分析師

2022-07-04 12:07:57

智慧城市智能建筑物聯網

2021-08-11 20:17:22

推薦算法系統

2025-02-18 16:27:01

2019-04-25 10:44:18

PHP開源庫C 語言

2025-04-22 03:00:00

2019-05-23 10:18:19

監控組件cpu

2017-11-08 11:53:54

開源人工智能軟件

2023-08-30 23:41:16

AI框架項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩成人免费中文字幕 | 日韩精品一区二区三区在线观看 | 就操在线| 精品久久久久一区二区国产 | 亚洲欧美国产精品一区二区 | 欧美日韩综合视频 | 欧美日韩一区二区在线观看 | 91精品国产91久久久久福利 | 在线一区二区国产 | 青青久草 | 国产中文字幕网 | 欧美视频免费 | 视频二区在线观看 | 性一交一乱一伦视频免费观看 | 亚洲精品成人在线 | 日韩欧美在线免费观看视频 | 成人精品一区二区三区中文字幕 | 欧洲成人免费视频 | 韩国精品在线观看 | 在线观看国产h | 久草新在线 | 国产91一区 | 欧美精品一区久久 | 伊人网在线综合 | 91麻豆精品国产91久久久更新资源速度超快 | 成人精品久久久 | 日韩在线小视频 | 成人午夜免费在线视频 | 欧美一区免费 | 国产精品成人品 | 狠狠亚洲| 美女视频久久 | 精品一区二区电影 | 欧美激情五月 | 精品久久久精品 | 福利久久 | 亚洲bt 欧美bt 日本bt | 91久久精品一区二区二区 | 色久在线 | 欧美一级淫片007 | 中文字幕 在线观看 |