如何用BeautifulSoup直接提取《国富论》在线版每页文本并生成DataFrame?
嘿,很高兴帮你搞定这个问题!确实,BeautifulSoup完全可以直接帮你提取单页书籍内容并构建DataFrame,不用绕弯路。下面给你拆解具体的实现思路和代码:
直接用BeautifulSoup提取内容构建DataFrame的方案
核心思路
先通过requests获取页面源码,用BeautifulSoup精准定位到书籍正文的容器标签(避开页眉、页脚、导航栏这些无关内容),提取整理文本后直接塞进DataFrame里,比先抓全部文本再清洗高效得多。
1. 先定位正文容器
首先打开目标页面,用浏览器开发者工具(F12)查看HTML结构,找到包裹书籍正文的核心标签。比如古腾堡的页面通常会把正文放在带id="text"的<div>里,或者带有特定class的容器里——这一步很关键,决定了你提取的内容是否干净。
2. 完整代码示例
import pandas as pd import requests from bs4 import BeautifulSoup import re # 替换成你要访问的完整页面URL target_url = 'https://www.gutenberg.org/files/38194/38194-h/38194-h.htm' # 获取页面内容,确保编码正确避免乱码 response = requests.get(target_url) response.encoding = 'utf-8' # 解析HTML soup = BeautifulSoup(response.text, 'html.parser') # 定位正文容器:这里以古腾堡的标准id="text"为例,你要根据实际页面调整 main_content = soup.find('div', id='text') # 提取所有段落文本,过滤空行和无效内容 paragraphs = [] for p in main_content.find_all('p'): text = p.get_text(strip=True) if text: # 跳过空段落 # 可选:清洗掉页码、页眉等干扰内容,比如开头的数字页码 cleaned_text = re.sub(r'^\d+\s*', '', text) paragraphs.append(cleaned_text) # 把单页内容整合成一条观测值,构建DataFrame page_df = pd.DataFrame({ 'page_url': [target_url], 'page_content': [' '.join(paragraphs)] }) # 查看结果 print(page_df)
3. 关键细节提醒
- 选择器一定要适配页面:如果你的目标页面正文不在
id="text"的div里,就用开发者工具找到正确的标签或class,替换find方法的参数(比如soup.find('article', class_='book-content'))。 - 文本清洗按需调整:如果页面里有其他干扰内容(比如章节标题重复、脚注),可以用正则表达式或者BeautifulSoup的
decompose()方法先移除干扰标签,再提取文本。 - 多页扩展:如果要处理多页内容,只需要把URL做成循环,每次提取单页内容后用
pd.concat()追加到DataFrame里即可。
这种方式直接精准抓取正文,比先抓全部文本再筛选要更简洁高效,完全替代你之前的迂回操作~
内容的提问来源于stack exchange,提问作者user21359
相关产品推荐
相关产品推荐

