Python与Pandas:网页内容逐行解析与结构化导出教程


Python与Pandas:网页内容逐行解析与结构化导出教程

本教程详细介绍了如何使用python的`requests`、`beautifulsoup`和`pandas`库,从网页中抓取结构化数据,并将其按行解析成清晰的字段(如章节标题、节号和节内容)。文章将指导读者如何利用css选择器精准定位目标元素,并通过迭代和数据重构,最终将抓取到的数据高效地导出为结构化的pandas dataframe,以便进一步分析或保存为csv文件。

在进行网络数据抓取(Web Scraping)时,一个常见的挑战是将从网页上获取的原始文本内容,按照其内在的逻辑结构进行拆分和整理,最终以结构化的形式(例如,按行、按字段)存储起来。本教程将以抓取在线圣经章节为例,演示如何利用Python的requests库获取网页内容,BeautifulSoup库解析HTML,以及pandas库进行数据结构化和导出。

1. 环境准备与库导入

首先,确保您已安装所需的Python库:requests用于发送HTTP请求,BeautifulSoup用于解析HTML,pandas用于数据处理。

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time # 用于添加请求延迟,避免对网站造成过大压力

2. 配置请求头与获取网页内容

为了模拟浏览器访问,我们需要设置User-Agent请求头。然后定义一个函数来获取指定URL的HTML内容。

# 配置请求头,模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}

# 定义获取网页内容的函数
def get_html_content(url):
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()  # 检查HTTP请求是否成功
        return r.text
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return None

# 目标URL
target_url = "https://www.bibliaonline.com.br/ara/mt/1"
html_content = get_html_content(target_url)

if html_content:
    # 使用BeautifulSoup解析HTML内容
    soup = BeautifulSoup(html_content, 'html.parser')
else:
    print("未能获取网页内容,程序退出。")
    exit()

3. 精准定位与提取数据

这是本教程的核心部分。原始代码尝试获取整个div.verseByVerse,然后在其内部寻找span.bv、span.v和span.t。这种方法的问题在于,find或find_all在循环外部调用时,会获取页面上的第一个匹配项,而不是当前迭代元素内部的匹配项。此外,对整个div.verseByVerse进行get_text()会将其所有子元素的文本拼接在一起,无法实现逐行导出。

正确的做法是,首先定位到每个独立的经文文本(span.t),然后利用其相对位置查找对应的经文编号(span.v)和章节标题(div.bv)。

通过分析目标网页的HTML结构,我们可以观察到:

iSlide PPT iSlide PPT

DeepSeek AI加持,输入主题生成专业PPT,支持Word/PDF等45种文档导入,职场汇报、教学提案轻松搞定

iSlide PPT 375 查看详情 iSlide PPT
  • 每段经文文本位于标签内。
  • 每段经文编号位于其紧邻的标签内。
  • 章节标题(如“A genealogia de Jesus Cristo”)位于标签内,且在相关经文的

    标签之前。

    我们可以使用CSS选择器div.verseByVerse p span.t来精确选择所有经文文本元素。然后,在遍历这些元素时,使用find_previous()方法来查找其前一个兄弟元素或祖先元素,以获取经文编号和章节标题。

    # 使用CSS选择器定位所有经文文本(span.t)
    # 这些span.t通常位于p标签内,p标签又位于div.verseByVerse内
    verse_text_elements = soup.select('div.verseByVerse p span.t')
    
    # 用于存储提取到的数据
    data = []
    current_chapter_title = ""
    
    for verse_element in verse_text_elements:
        # 查找最近的、前一个的div元素作为章节标题
        # 注意:这里需要考虑标题可能只出现一次,然后适用于其后的多节经文
        # 因此,我们应该找到最近的div.bv,并更新current_chapter_title
        previous_div = verse_element.find_previous('div', class_="bv")
        if previous_div:
            current_chapter_title = previous_div.get_text(strip=True)
    
        # 查找最近的、前一个的span元素作为经文编号
        verse_number_element = verse_element.find_previous('span', class_="v")
    
        verse_number = verse_number_element.get_text(strip=True) if verse_number_element else ""
        verse_content = verse_element.get_text(strip=True)
    
        data.append({
            '章节标题': current_chapter_title,
            '经文编号': verse_number,
            '经文内容': verse_content
        })
    
    # 打印部分提取结果,以便检查
    # for item in data[:5]:
    #     print(item)

    关键点解释:

    • soup.select('div.verseByVerse p span.t'): 这是一个强大的CSS选择器,它会找到所有在class="verseByVerse"的div内部,且在p标签内部的class="t"的span标签。这确保我们只获取到实际的经文文本。
    • verse_element.find_previous('div', class_="bv"): 对于当前迭代的verse_element (即span.t),此方法会向上(DOM树方向)查找其所有祖先和前一个兄弟节点,直到找到第一个匹配div标签且class为bv的元素。这样可以动态地获取每个经文所属的章节标题。由于章节标题通常在多个经文前只出现一次,我们使用current_chapter_title变量来存储并复用,直到遇到下一个标题。
    • verse_element.find_previous('span', class_="v"): 同样地,这会找到当前经文文本span.t之前最近的span标签,且class为v,即经文编号。

    4. 数据结构化与导出

    将提取到的数据列表转换为Pandas DataFrame,然后可以方便地导出为CSV文件。

    # 将数据转换为Pandas DataFrame
    df = pd.DataFrame(data)
    
    # 打印DataFrame的前几行
    print("DataFrame预览:")
    print(df.head())
    
    # 添加延迟,避免短时间内大量请求
    time.sleep(1)
    
    # 将数据导出到CSV文件
    # index=False表示不将DataFrame的索引写入CSV文件
    output_filename = 'biblia_mateus_cap1.csv'
    df.to_csv(output_filename, index=False, encoding='utf-8-sig') # 使用'utf-8-sig'处理中文编码问题
    
    print(f"\n数据已成功导出到 {output_filename}")

    5. 完整代码示例

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    import time
    
    # 配置请求头,模拟浏览器访问
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
    }
    
    # 定义获取网页内容的函数
    def get_html_content(url):
        try:
            r = requests.get(url, headers=headers)
            r.raise_for_status()  # 检查HTTP请求是否成功
            return r.text
        except requests.exceptions.RequestException as e:
            print(f"请求失败: {e}")
            return None
    
    # 目标URL
    target_url = "https://www.bibliaonline.com.br/ara/mt/1"
    print(f"正在获取网页内容: {target_url}")
    html_content = get_html_content(target_url)
    
    if html_content:
        # 使用BeautifulSoup解析HTML内容
        soup = BeautifulSoup(html_content, 'html.parser')
    
        # 使用CSS选择器定位所有经文文本(span.t)
        verse_text_elements = soup.select('div.verseByVerse p span.t')
    
        # 用于存储提取到的数据
        data = []
        current_chapter_title = "" # 用于存储当前章节标题,因为标题可能只出现一次
    
        print("开始解析经文数据...")
        for verse_element in verse_text_elements:
            # 查找最近的、前一个的div元素作为章节标题
            # 如果找到新的章节标题,则更新current_chapter_title
            previous_div = verse_element.find_previous('div', class_="bv")
            if previous_div:
                current_chapter_title = previous_div.get_text(strip=True)
    
            # 查找最近的、前一个的span元素作为经文编号
            verse_number_element = verse_element.find_previous('span', class_="v")
    
            verse_number = verse_number_element.get_text(strip=True) if verse_number_element else ""
            verse_content = verse_element.get_text(strip=True)
    
            data.append({
                '章节标题': current_chapter_title,
                '经文编号': verse_number,
                '经文内容': verse_content
            })
    
        # 将数据转换为Pandas DataFrame
        df = pd.DataFrame(data)
    
        # 打印DataFrame的前几行
        print("\nDataFrame预览:")
        print(df.head())
    
        # 添加延迟,避免短时间内大量请求
        time.sleep(1)
    
        # 将数据导出到CSV文件
        output_filename = 'biblia_mateus_cap1.csv'
        df.to_csv(output_filename, index=False, encoding='utf-8-sig') # 使用'utf-8-sig'处理中文编码问题
    
        print(f"\n数据已成功导出到 {output_filename}")
    
    else:
        print("未能获取网页内容,程序退出。")

    6. 注意事项与总结

    • 网站结构变化: 网页的HTML结构可能会随时间变化。如果您的代码突然失效,请检查目标网站的HTML结构是否已更新,并相应调整您的CSS选择器或find方法。
    • 反爬机制: 某些网站有严格的反爬机制,可能会检测并阻止频繁的请求。除了User-Agent,可能还需要考虑使用代理IP、设置更长的请求间隔、处理验证码等。
    • robots.txt: 在抓取任何网站之前,请务必查看其robots.txt文件(例如:https://www.bibliaonline.com.br/robots.txt),了解网站的抓取政策。遵守这些规定是网络爬虫的基本道德和法律要求。
    • 数据清洗: 抓取到的原始数据可能需要进一步的清洗和格式化,例如去除多余的空格、特殊字符等。
    • 错误处理: 在实际项目中,应增加更完善的错误处理机制,例如try-except块来捕获网络请求失败、HTML解析错误等异常。

    通过本教程,您应该已经掌握了如何利用Python和相关库,高效地从复杂网页中提取结构化数据,并将其整理成易于分析和存储的格式。这种方法不仅适用于圣经章节,也可以推广到其他需要逐行解析和结构化处理的网页抓取任务中。

以上就是Python与Pandas:网页内容逐行解析与结构化导出教程的详细内容,更多请关注其它相关文章!


# 福州seo观网信息科技  # 转换为  # 如何使用  # 导出到  # 第一个  # 重构  # 适用于  # 优秀网站栏目建设  # 西宁抖音seo搜索优化  # 您的  # 有效的seo报价  # 个人博客网站建设定制  # 烟台海外网站建设  # 兴安盟网络营销的推广  # 网站建设题  # 公司怎么自制网站推广平台  # 烟台网站推广微訫hfqjwl下拉推广  # css  # 数据结构  # 选择器  # 结构化  # ap  # win  # ai  # csv  # safari  # app  # 浏览器  # 编码  # 网络爬虫  # windows  # html  # python 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: Flexbox布局:实现粘性导航与底部页脚的完美结合  win11自带录屏文件保存在哪里 Win11 Game Bar录制视频默认路径【分享】  Safari浏览器自动填表功能失效怎么办 Safari表单管理修复  《360浏览器》自动保存账号密码设置方法  《兴业银行》注册登录方法  Keras中Convolution2D层及其核心辅助层详解  Eclipse开发J*a快速入门  diskgenius分区工具如何设置Bios启动项  iphone16系列配置参数介绍  空腹吃苹果好吗 苹果空腹摄入指南  126手机126邮箱登录_126邮箱手机登录入口官网  《广发易淘金》国债逆回购操作教程  《新三国志曹操传》游历事件袁尚突围攻略  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  j*a中ArrayBlockingQueue的使用  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  Go Template中优雅处理循环最后一项:自定义函数实践  免费占卜在线神算_免费占卜手机神算  Symfony路由参数转换器:实体存在性验证与错误处理策略  奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧  J*a里如何处理ArithmeticException并防止除零_算术异常防护策略解析  手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧  使用jQuery精确检测除指定元素外任意位置的点击事件  POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩  抖音视频如何添加标题?添加标题有哪些好处?  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  J*aScript字符串_Unicode处理  解决Flex容器横向滚动内容截断与偏移问题  J*aScript桌面应用_Electron多进程架构实战  多多买菜门店端app订单查看方法  使用Google服务账号实现Google Drive API无缝集成与文件访问  智学网成绩单查询系统网_智学网学生平台登录  4399小游戏下装链接 4399小游戏下载链接入口  J*aScript与HTML元素交互:图片点击事件与链接处理教程  使用Selenium在无头Chrome中交互动态菜单和复选框的策略  不吃碳水化合物是健康减肥的好办法吗  电脑的“恢复环境(WinRE)”找不到怎么办_Windows系统恢复环境重建【高级修复】  如何用mysql开发用户注册登录功能_mysql用户注册登录数据库设计  百度网盘网页入口链接分享 百度网盘官网入口网页登录  QQ邮箱手机版网页版 QQ邮箱登录入口地址  sf漫画官网登录入口直达_sf漫画官方正版网址  苹果自助维修计划支持哪些设备机型  PHP页面重载时变量值不重置的实现方法  pubmed数据库官方主页_pubmed学术论文查找官网直达  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  歌词怎么展示在|直播|间视频号?有什么注意事项?  J*aScript模块加载器_RequireJS原理分析  在VS Code中进行数据科学和机器学习开发  《华夏千秋》龙女试炼功法获取方法 

 2025-11-18

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.