PyQuery解析網(wǎng)頁用法入門講解
1. Pyquery的安裝
在使用pyquery解析庫之前,首先簡單介紹一下pyquery然后講解如何安裝pyquery庫。
- pyquery的基礎概念
Pyquery也是一個功能很強大的網(wǎng)頁解析庫,它支持對xml、html文檔進行jQuery查詢。
- 安裝pyquery
pyquery的安裝其實很簡單,下面介紹兩種不同的安裝方式(適用不同的操作系統(tǒng))。
- #方式一:pip安裝 pip install pyquery
- #方式二:wheel安裝
- #下載對應系統(tǒng)版本的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/
- pip install pyquery-1.4.3-py3-non-any.whl
方式一:安裝比較簡單,通過pip install pyquery命令就可以直接安裝;
方式二:首先需要下載whl文件,然后再去安裝。
其下載鏈接為:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml。
進入這個鏈接后找到pyquery-1.4.3-py3-none-any.whl,并將其下載到本地。
2. Pyquery的使用方法
通過上述方法安裝好pyquery之后,我們開始導入pyquery,并通過一個例子去了解pyquery的基本使用方法。首先構造了一段html源碼,然后初始化為pyquery對象。
完整代碼如下:
- from pyquery import PyQuery as pq
- html = '''
- <div id = "container">
- <ul>
- <li>第1個</li>
- <li><a href = "link2.html">第2個</a></li>
- <li class = "i0 active"><a href = "link3.html"><span>第3個</span></a></li>
- <li class = "i1 active"><a href = "link4.html">第4個</a></li>
- <li><a href = "link5.html">第5個</a></li>
- </ul>
- </div>
- '''
- py= pq(html)
- 獲取標簽元素
目標:比如我們需要獲取html中的li標簽
- #方式一
- print(py('li'))
- #方式二
- # 注意下面id 前面需要加上#,class 前面需要加上.
- print(py('#container .list li'))
這里有兩種獲取方式,第一種比較簡單,第二種方法定位更加準確。針對上述的html源碼,這兩種方式獲取的結果是一樣的,其結果如下:
- <li>第1個</li>
- <li><a href="link2.html">第2個</a></li>
- <li class="i0 active"><a href="link3.html"><span>第3個</span></a></li>
- <li class="i1 active"><a href="link4.html">第4個</a></li>
- <li><a href="link5.html">第5個</a></li>
- 查詢子級標簽元素
目標:獲取class為list的ul標簽下的所有子標簽(li標簽),其代碼如下:
- items = py('.list')
- lis = items.children()
- print(lis)
最后打印輸出的結果同上,都是把所有的li標簽打印輸出。
- 查詢父級標簽元素
目標:獲取class為list的ul標簽的上一級標簽(div標簽),其代碼如下:
- items = py('.list')
- pa = items.parent()
- print(pa)
打印輸出結果:
- <div id="container">
- <ul>
- <li>第1個</li>
- <li><a href="link2.html">第2個</a></li>
- <li class="i0 active"><a href="link3.html"><span>第3個</span></a></li>
- <li class="i1 active"><a href="link4.html">第4個</a></li>
- <li><a href="link5.html">第5個</a></li>
- </ul>
- </div>
- 獲取元素信息
目標:獲取class為i0 active的a標簽元素,并提取出a標簽元素的相關信息
- a = py('.i0.active a')
- # 標簽內容
- print(a)
- # 獲取屬性(兩種方式)
- print(a.attr.href)
- print(a.attr('href'))
- # 獲取文本
- print(a.text())
- # 獲取<a>標簽里的源碼
- print(a.html())
結果:
- <a href="link3.html"><span>第3個</span></a>
- link3.html
- link3.html
- 第3個
- <span>第3個</span>
3. 實戰(zhàn):抓取由關鍵字搜索的結果
內容:抓取小說網(wǎng)站由關鍵字搜索的結果,并采集結果中小說的書名和鏈接
思路:首先在小說網(wǎng)站里面搜索關鍵字:斗羅,然后利用爬蟲抓取搜索返回的結果中小說的書名和鏈接,這過程中通過pyquery去解析網(wǎng)頁源碼,最后提取出數(shù)據(jù)。
鏈接:http://book.chenlove.cn/search.html?keyword=斗羅
在瀏覽器中訪問鏈接:
在編寫之前先分析一下網(wǎng)頁源碼:
查看源代碼,可以知道每一本書的數(shù)據(jù)都在class為bigpic-book-name的a標簽中,首先使用pyquery去解析其a標簽,然后進行循環(huán)遍歷。
完整代碼如下:
- from pyquery import PyQuery as pq
- import requests
- # 設置代理服務器
- headers = {
- 'User_Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
- }
- #請求連接
- url = "http://book.chenlove.cn/search.html?keyword=斗羅"
- response = requests.get(url, headers=headers)
- if response.status_code == 200:
- # 轉化為utf-8格式,不加這條語句,輸出爬取的信息為亂碼
- response.encoding = 'utf8'
- # 把網(wǎng)頁解析為pyquery對象
- py = pq(response.text)
- a_list = py('.bigpic-book-name').items()
- for i in a_list:
- # 獲取書名
- print(i.text())
- # 獲取書名鏈接
- print(i.attr('href'))
上一小節(jié)我們學會了如何去提取a標簽中的內容和鏈接,同樣的這里一樣使用text()和attr()去解析內容和鏈接。
結果:
- 智行斗羅
- /novel/235.html
- 從炸掉魂環(huán)開始的斗羅
- /novel/219.html
- 旅途從斗羅開始
- /novel/195.html
- 斗羅之卡BUG
- /novel/159.html
- 終極斗羅
- /novel/54.html
本文轉載自微信公眾號「Python研究者」,可以通過以下二維碼關注。轉載本文請聯(lián)系Python研究者公眾號。