一个爬取菜鸟教程网站教程,并保存为本地 MarkDown 文件(Python)

Python 3 | 菜鸟教程 (一) 目录 一、Python3 简介 二、Python 发展历史 三、Python 特点 (一)易于学习 (二)易于阅读 (三)易于维护 (四)一个广泛的标准库 (五)互动模式 (六)可移植 (七)可扩展 (八)数据库 (九)GUI编程 (十)可嵌入 四、Python 应用 五、 Python3 环境搭建 六、Python3 下载 七、Python 安装 (一)下载地址 (二)Unix & Linux 平台安装 Python3: (三)Window 平台安装 Pyt 阅读详情

转自我博客文章
Posts: 一个爬取菜鸟教程网站教程,并保存为本地 MarkDown 文件(Python)

爬取菜鸟教程,在学校无聊时看


使用方法

index_url 输入教程网址,如 https://www.runoob.com/css/css-tutorial.html.
downdir 输入下载的目录.
然后享受去吧

import markdownify
import requests
from bs4 import BeautifulSoup
import re
import os
import sys
import signal

# 全局变量

# index_url = 'https://www.runoob.com/python/'
# downdir = '/storage/emulated/0/git/python-code/h/'

# 后续记得写速率控制,和input

index_url = str(input("index_url: "))
downdir = str(input("downdir: "))

if not downdir.endswith('/'):
    downdir = downdir + "/"
# 文件路径生成
if not os.path.exists(downdir):
    os.makedirs(downdir)
#------------------------

# 网络请求,直接返回text
def get_url(url,headers=None,encoding="",return_content_and_reality_url=False):
    # 设置请求头
    if headers is None:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
        }
    # 发送请求
    response = requests.get(url,headers=headers)
    #设置编码
    if encoding != "":
        response.encoding = encoding
    if return_content_and_reality_url:
        x=[]
        x.append(response.url) # url
        x.append(response.content) # 内容
        return(x)
    return(response.content)



# 转 markdown
def to_markdown(html_text):
    html_text = change_example_code_divs(html_text) # 处理实例代码
    return(markdownify.markdownify(html_text))

# 写入文件,必须用绝对路径
def write_file(text,path,encoding='utf-8'):
    with open(path, 'w', encoding=encoding) as f:
        f.write(text)
        f.close()
# def write_file(text,path):
#     with open(path, 'w') as f:
#         f.write(text)
#         f.close()

# 追加写入文件
def write_file_a(text,path):
    with open(path, 'a', encoding='utf-8') as file_a:
        file_a.write(text)
        file_a.close()

# 读取文件
def read_file(path,encoding='utf-8'):
    x = open(path, 'r', encoding=encoding)
    t = x.read()
    x.close()
    return(t)

# url_root
def get_root_url(url):
    # 去掉任何末尾的路径部分,只保留域名和最后的路径部分
    url = re.sub(r'/[^/]*$', '/', url)
    return url

# 首页url
def get_base_url(url):
    # 正则表达式匹配协议和域名部分
    match = re.match(r'(https?://[^/]+)', url)
    if match:
        return match.group(1)
    return None

# 安全文件名
def safe_filename(filename):
    invalid_chars = '\\/:*?"<>|'
    for char in invalid_chars:
        filename = filename.replace(char, '_')
    return filename

# 删除被<>包裹的内容
def remove_tags(text):
    soup = BeautifulSoup(text, 'html.parser')
    return soup.get_text()

def change_example_code_divs(html_content):
    # 解析HTML内容
    soup = BeautifulSoup(html_content, 'html.parser')

    # 查找所有包含代码的容器
    example_code_divs = soup.find_all('div', class_='example_code')

    # 如果找到了包含代码的容器,进行处理
    for example_code_div in example_code_divs:
        # 提取所有文本内容并去除多余的HTML标签
        code_lines = example_code_div.get_text()
        
        # 去除多余的空行与空格
        cleaned_code = re.sub(r'\n\s*\n', '\n', code_lines).strip()
        
        # 构建标准化的 <pre><code> 结构
        new_code_block = soup.new_tag('pre')
        code_tag = soup.new_tag('code')
        code_tag.string = cleaned_code
        new_code_block.append(code_tag)

        # 将原始代码块替换为新的标准代码块
        example_code_div.replace_with(new_code_block)

    # 输出转换后的HTML
    return((soup.prettify()))

# 退出程序
def exit_ctrl_c(sig, frame):
    print("\n退出程序...")
    sys.exit(0)

print('载入函数成功')
#-------------------------

def main():
    global index_url
    global downdir
    index_response = get_url(index_url,return_content_and_reality_url=True)
    index_html = index_response[1]
    index_url = index_response[0]
    index_url_root = get_root_url(index_url)
    root_url = get_base_url(index_url)

    # 解析网页内容
    print("解析网页内容")
    index_soup = BeautifulSoup(index_html, 'html.parser')

    # 建立 index 列表
    print("建立 index 列表")

    index_links = []
    for link in index_soup.select('div.sidebar-box.gallery-list a'):
        # 去除两侧空格
        list_title = link.string.strip() if link.string else "No Title"
        list_link = link.get('href')
        if list_link.startswith('/'):
            list_link = root_url + list_link
        else:
            list_link = index_url_root + list_link
        index_links.append(list_title + ':::' + list_link)

    print("-----------------------------")
    print(index_links)
    print("-----------------------------")
    # 建立目录文件
    directory_file = downdir + '目录.md'
    write_file_a(f"## {index_soup.title.string}\n",directory_file)
    # with open(directory_file, 'a', encoding='utf-8') as directory_file_x:
        # directory_file_x.write(f"## {index_soup.title.string}\n")

    # 循环爬取
    print("循环爬取")
    index_links_len = len(index_links)
    for i,link in enumerate(index_links):
        # print(link)
        link = link.split(':::')
        link_url = link[1]
        link_html = get_url(link_url)
        # 解析
        link_soup = BeautifulSoup(link_html, 'html.parser')
        # print(link_soup)
        # 提取相关信息
        # title
        link_title_len = len(link_soup.select('.article-body  h1'))
        if link_title_len == 0:
            link_title_len = len(link_soup.select('.article-body  h2'))
            if link_title_len == 0:
                link_title = link[0]
            else:
                link_title = remove_tags(str(link_soup.select('.article-body  h2')[0])).strip()
                if len(link_title) > 35:
                    link_title = link[0]
        else:
            link_title = remove_tags(str(link_soup.select('.article-body  h1')[0])).strip()
            if len(link_title) > 35:
                link_title = link[0]
        # link_title = link[0]
        print(f"[{i+1}/{index_links_len}]:{link_title}")
        link_content = str(link_soup.select('.article-body')[0])
        link_content_markdown = to_markdown(link_content)
        # 生成文本内容
        link_file_content = str(f"## [{link_title}]({link_url})\n\n[index](目录.md)\n\n---\n{link_content_markdown}")
        # 文件路径
        link_file_path = downdir + safe_filename(link_title) + ".md"
        # 写入文件
        write_file(link_file_content,link_file_path)
        # 更新目录
        link_url_top = safe_filename(link_title) + ".md"
        write_file_a(f"- [{link_title}]({link_url_top.replace(" ","%20")})\n",directory_file)

    print('success !')
    print("\n退出程序...")
    sys.exit(0)

if __name__ == "__main__":
    signal.signal(signal.SIGINT, exit_ctrl_c)
    main()
ISO26262 功能安全各个阶段测试要求 1. 开发过程说明 系统层面:包括软硬件集成测试、系统集成测试以及整车测试。 硬件层面:包括硬件集成与测试。 软件层面:单元测试、集成测试。 2. 功能安全总体要求 2.1 各项指标 2.2 诊断覆盖度举例 针对一个信号举例说明: 3. 功能安全测试要求 3.1 测试计划 核心内容应包括, 测试对象:需要测试的对象描述,以及测试的范围描... 阅读详情

相关推荐

【机器人开发】四足机械狗(并联结构)URDF建模与Simscape仿真全流程解析

本文详细解析了四足机械狗(并联结构)从URDF建模到Simscape仿真的全流程开发。内容涵盖SolidWorks建模要点、URDF文件导出与优化、Matlab/Simscape环境搭建,以及并联机构特有的运动控制和步态规划实现,为机器人开发者提供了一套完整的解决方案。

weixin_30642561的博客 529

菜鸟教程 http://www.runoob.com/

http://www.runoob.com/

yuxuac的专栏 1万+

STM32驱动AS5600磁性旋转位置传感器模块

文章目录简介引脚定义I2C接口写数据读数据从指定的地址开始读数据驱动程序cubeMX配置驱动程序`bsp_as5600.h``bsp_as5600.c`测试程序参考资料 简介 AS5600 是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。 这种非接触式系统测量径向磁化轴上磁铁的绝对角度。 该 AS5600 专为非接触式电位计应用而设计,其坚固的设计消除了任何同质外部杂散磁场的影响。 引脚定义 I2C接口 7位设备地址为0x36(二进制表示为0110110) 支持标准模式和

ApexYuan 1万+

菜鸟教程 之 JavaScript 教程、json、jsonp

JavaScript 是 Web 的编程语言,也是一种轻量级的编程语言。所有现代的 HTML 页面都使用 JavaScript。 JavaScript 可以嵌入到 HTML 页面。在 HTML 页面中插入 JavaScript 时使用 标签。 和 会告诉 JavaScript 在何处开始和结束。 和 之间的代码行包含了 JavaScript 代码。

freeking101的博客 5492

Spring AI Alibaba Graph进阶:如何用图算法优化你的推荐系统?

本文深入探讨了如何利用Spring AI Alibaba Graph的图算法优化推荐系统。通过分析用户行为数据的网络化特征,结合加权随机游走和社区发现算法,显著提升推荐精准度和用户点击率。文章还分享了混合推荐架构设计、性能优化技巧及生产环境中的实战经验,为开发者提供了一套完整的图算法推荐解决方案。

weixin_33738555的博客 128

Unity 2021 LTS安装避坑指南:从下载到第一个3D项目的完整流程

本文提供了一份详尽的Unity 2021 LTS安装与首个3D项目创建指南。内容涵盖从Unity Hub下载、版本选择、模块安装避坑,到编辑器界面解析、创建旋转立方体脚本的完整流程,旨在帮助初学者快速搭建稳定开发环境并上手核心操作。

mango的博客 310

菜鸟教程:零基础HTML入门

HTML入门 文章目录一、HTML是什么?二、入门实例1.新建html文档2.html常用标签三、属性总结 一、HTML是什么? HTML全称:Hyper Text Markup Language 中文名:超文本标记语言 HTML是由W3C组织定义的语言标准,是用于描述页面机构的语言。 二、入门实例 1.新建html文档 如图: 每一个html文件开头必须是这个标签,作用是告诉浏览器此文档为html文档。 :根元素在所有的html文件中这个元素级别最高 网页编码格式,一般为UTF-8 中间内容就是这个h

weixin_52163352的博客 2万+

Ansys-结构动力学分析-圆柱斜齿轮模态分析学习心得

模态分析的步骤基本一直,不同点在于选择什么单元类型,模型,节点约束等 圆柱斜齿轮模态分析的难点在于圆柱斜齿轮的模型建立,和所要约束的节点的选择。 用命令流方法建立齿轮模型效率较高,当然,在ansys里建立复杂的模型实在不敢恭维,对于自下而上建模,需要知道每个关键点的坐标位置。下图是创建圆柱斜齿轮模型的命令流方式。 模型不同使用的数据也就不同了。 对于施加约束的问题这就必须要熟悉select e...

weixin_45385183的博客 1831

Html 5菜鸟教程(建议新生学习)

HTML5是构建Web内容的一种语言描述方式。HTML5是互联网的下一代标准,是构建以及呈现互联网内容的一种语言方式,被认为是互联网的核心技术之一。HTML产生于1990年,1997年HTML4成为互联网标准,并广泛应用于互联网应用的开发。HTML5是Web中核心语言HTML的规范,用户使用任何手段进行网页浏览时看到的内容原本都是HTML格式的,在浏览器中通过一些技术处理将其转换成为了可识别的信息。

分享 Windows 系统部署、镜像封装、终端管理、故障排查与运维自动化实践,涵盖 Sysinternals、PowerShell 和 AI 工具应用。记录真实问题、探索过程与解决方法,也分享 AI 时代的学习心得和实践经验,让技术更易理解 2万+

GD32F307 USB主机模式 外接U盘升级 调试问题记录

在移植USB驱动做主机读U盘时遇到的问题。 问题1、移植USB驱动完成后,插入U盘,一直在 usbh_core_task 的默认case 和测试case中反复执行无法执行到后面的连接及以后得步骤。 问题2、在 usbh_core_task 函数中,一直卡在枚举的case,无法执行下面操作。具体卡在urb_wait的while循环无法跳出。

LGC_764385701的博客 1949

从FSI到三层堆叠:一文搞懂车载CIS图像传感器技术演进与选型避坑

本文深入解析车载CIS图像传感器从FSI到三层堆叠的技术演进,揭示不同结构在低光性能、HDR表现和温度稳定性上的关键差异。通过实测数据对比,指导智能驾驶系统选型策略,帮助开发者规避成本与性能的常见陷阱,提升车载摄像头在复杂环境下的成像质量。

weixin_30689307的博客 101

python自学免费教程视频,python自学网站免费视频

大家好,小编为大家解答python自学网站免费 真的有用?的问题。很多人还不知道python自学网站免费菜鸟教程,现在让我们一起来看看吧!今天一并给大家整理推送,希望能帮你在这条道路上,走得更顺畅,走得更远,更稳…

Rtee1的博客 788

【100%通过率】2023华为od机试C卷【电脑病毒感染】C++ 实现

一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.

MISAYAONE的博客 1727

从入门到精通,收下这 22 个 Python 学习网站_python学习网站

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习。

2401_84139624的博客 1186

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

python零基础入门到精通,python零基础入门教程

大家好,小编为大家解答零基础学python从入门到精通的问题。很多人还不知道python零基础入门到精通,现在让我们一起来看看吧!今天一并给大家整理推送,希望能帮你在这条道路上,走得更顺畅,走得更远,更稳…

npy199331的博客 900

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

肝了一夜,用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换...

点上方“菜鸟学Python”,选择“星标” 第462篇原创干货,第一时间送达 pdf作为一种便携式的文档格式,在日常生活中具有非常广泛的应用。对于pdf 的应用,无论是文件打印、文档提交、...

cainiao_python的博客 7037

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python在哪里学比较好 知乎,python去哪里学比较好

大家好,给大家分享一下python在哪里学比较好 知乎,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!今天一并给大家整理推送,希望能帮你在这条道路上,走得更顺畅,走得更远,更稳…

weixin_61088415的博客 912

python从入门到精通教学版,python从入门到精通书籍

大家好,小编来为大家解答以下问题,python教程600集python从入门到精通教程,python从入门到精通在线阅读,今天让我们一起来看看吧!今天一并给大家整理推送,希望能帮你在这条道路上,走得更顺畅,走得更远,更稳…

2401_85597209的博客 596

python编程课哪个机构最好,学python用什么软件编程

大家好,小编为大家解答学python编程能做什么工作的问题。很多人还不知道python编程课哪个机构最好,现在让我们一起来看看吧!今天一并给大家整理推送,希望能帮你在这条道路上,走得更顺畅,走得更远,更稳…

神经网络爱好者 96

神码ai火车头伪原创插件怎么用【php源码】

大家好,小编来为大家解答以下问题,python自学网站免费 真的有用?,python自学网站免费菜鸟教程,现在让我们一起来看看吧!今天一并给大家整理推送,希望能帮你在这条道路上,走得更顺畅,走得更远,更稳…

wenangou的博客 154

2024-2026年AI Agent开发学习路线:从零到全栈实战指南

如果你计划在2026年转行AI Agent开发,现在开始规划学习路线是完全可行的。AI Agent作为连接大模型与现实应用的关键技术,正从概念走向大规模商业化,对开发者的需求日益增长。这份路线图不是空谈理论,而是聚焦于能让你在两年内构建出可部署、可交互、能解决实际问题的智能体。无论你是否有编程基础,只要按照这个分阶段、重实操的路径坚持学习,就能系统性地掌握从基础到进阶的全栈技能。 最核心的路径可以概括为: 编程与算法基础 → 大模型原理与应用 → Agent核心框架开发 → 全栈工程化与部署 → 垂直领域深

chuiqi9947的博客 465

西安交大吴宁教授《大学计算机基础》48讲:零基础构建系统知识体系

计算机科学的核心在于理解其基础原理与系统架构,这构成了所有上层技术应用的基石。从二进制、冯·诺依曼体系结构到操作系统、网络协议,这些基本原理揭示了计算机如何表示、处理和传输信息。掌握这些知识,不仅能构建完整的计算机系统认知框架,更是深入学习编程、数据结构、人工智能等前沿领域的先决条件。对于零基础学习者、跨专业考研者或希望夯实理论根基的职场人士而言,一套体系化、权威性的基础课程至关重要。西安交通大学吴宁教授主讲的《大学计算机基础》48讲视频课程,正是这样一套经典资源。它以**计算机发展史、数制与编码、硬件组成

weixin_34348174的博客 391

菜鸟教程 之 JavaScript 教程

From:菜鸟教程JavaScript:https://www.runoob.com/ W3SchoolJavaScript 教程:http://www.w3school.com.cn/js/index.asp https://www.w3cschool.cn/javascript/ 廖雪峰官网 JavaScript 教程:https://...

墨鱼菜鸡 1万+

python网页爬虫菜鸟教程_Python爬虫实践(7)-抓取菜鸟教程python学习路线-工具-站长头条...

本期为python爬虫实践的第七节,传送门:Python爬虫实践(1)--大数据时代的数据挑战Python爬虫实践(2)--非结构化数据与爬虫Python爬虫实践(3)--了解网络爬虫背后的秘密Python爬虫实践(4)--编写第一个网络爬虫程序Python爬虫实践(5)--使用BeautifulSoup解析网页元素Python爬虫实践(6)--BeautifulSoup的基础操作经过前面6期的讲...

weixin_39783771的博客 527

26.Python3面向对象编程|菜鸟教程

类:描述具有相同的属性和方法的对象的集合。定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。局部变量:定义在方法中的变量,只用于当前实例的类。实例变量。

m0_57656758的博客 1088
上一篇: 将 Umami Cloud 数据导出迁入到自搭建的 Umami
Kissablecho
博客等级 码龄4年 73粉丝 14原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值