Python從零開始寫爬蟲-4 解析HTML獲取小說正文


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的標記語言, 例如:&nbsp:, <br />等.下面我們將對提取到正文進行進一步的處理, 使其符合我們的閱讀習慣.

處理正文

在html標記語言中, &nbsp;表示空格, <br />表示換行符. 我們按照該要求替換正文中的內容.

text = text.replace('&nbsp;', ' ')
text = text.replace('<br />', '\n')

看起來好多, 但是有一個問題, 段與段之間的空行好像有點多啊, 通過print(repr(text))我們可以發現, 段與段之間存在四個換行符\n, 正常情況, 段與段之間只有一個換行符, 我們需要將四個換行符替換成一個換行符.

text = text.replace('\n\n\n\n', '\n')
print(text)

發現空行處理好了, 但是在末尾還有一些我們不希望存在的文字出現, 他們被包裹在<center>(.|\n)</script> 之間.我們需要把他替換掉, strreplace是不支持正則表達式替換的, 我們需要使用resub.

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('&nbsp;', ' ')
    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來獲得小說的正文, 最后通過不斷的處理, 最終獲得我們希望的樣子.但是注意: 每個以網站的格式都不一樣, 甚至每一篇小說的格式都一樣, 應根據情況處理正文.


免責聲明!

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



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