Python從零開始寫爬蟲-4 解析HTML獲取小說正文
在上一節中, 我們已經學會如何獲取小說的目錄, 這一節我們將學習如何通過正則表達式(在第二節學習過)來獲取小說正文.
首先, 先隨便選擇一個章節, 作為例子, 我們就以 "吞噬星空第一章:羅峰"為例子, 來進行我們的學習.
首先依然式先獲取該網頁的源代碼
import requests
r = requests.get('http://www.biquger.com/biquge/12928/4282781')
r.encoding = 'utf-8'
print(r.text)
通過分析源代碼, 我們可以發現小說的正文被<div class"content" id="booktext">...</div>
包括. 那我們就可以通過正則表達式提取該部分內容即可.
使用正則表達式提取正文
按照我們之前所學的, 使用下列正則表達式搜索:
res = re.search(r'<div class="content" id="booktext">((.)*?)</div>', r.text)
print(res)
可以發現, 沒有搜索結果. 查看正則表達式說明文檔, 發現 .
是不匹配換行符, 而我們的小說正文不可能只有一行, 所以無法匹配. 我們的正文應該是所有字符加換行符, 應該使用: (.|\n)
, 使用[.\n]
是不可以的, 原因我也不知道.
res = re.search(r'<div class="content" id="booktext">((.|\n)*?)</div>', r.text)
text = res.group(1)
print(text)
我也經成功提取到了正文, 但是發現里面很多html的標記語言, 例如: :
, <br />
等.下面我們將對提取到正文進行進一步的處理, 使其符合我們的閱讀習慣.
處理正文
在html標記語言中,
表示空格, <br />
表示換行符. 我們按照該要求替換正文中的內容.
text = text.replace(' ', ' ')
text = text.replace('<br />', '\n')
看起來好多, 但是有一個問題, 段與段之間的空行好像有點多啊, 通過print(repr(text))
我們可以發現, 段與段之間存在四個換行符\n
, 正常情況, 段與段之間只有一個換行符, 我們需要將四個換行符替換成一個換行符.
text = text.replace('\n\n\n\n', '\n')
print(text)
發現空行處理好了, 但是在末尾還有一些我們不希望存在的文字出現, 他們被包裹在<center>(.|\n)</script>
之間.我們需要把他替換掉, str
的replace
是不支持正則表達式替換的, 我們需要使用re
中sub
.
text = re.sub(r'<center>(.|\n)*?</script>', '', text)
print(text)
可以發現,現在的正文已經符合我們的閱讀習慣了.
整理
將上面的內容整理成函數, 今天的學習就結束了
def parse(url):
r = requests.get(url)
r.encoding = 'utf-8'
res = re.search(r'<div class="content" id="booktext">((.|\n)*?)</div>', r.text)
text = res.group(1)
text = text.replace(' ', ' ')
text = text.replace('<br />', '\n')
text = text.replace('\n\n\n\n', '\n')
text = re.sub(r'<creturn textenter>(.|\n)*?</script>', '', text)
return text
總結
我們已經獲得該章節的正文了, 在該學習中, 我們先通過requests
獲得小說正文網頁的源代碼, 然后通過re.search
來獲得小說的正文, 最后通過不斷的處理, 最終獲得我們希望的樣子.但是注意: 每個以網站的格式都不一樣, 甚至每一篇小說的格式都一樣, 應根據情況處理正文.