python 爬虫 生成markdown文档

本文介绍的案例为使用python爬取网页内容并生成markdown文档,首先需要确定你所需要爬取的框架结构,根据网页写出对应的爬取代码

1.分析总网页的结构

我选用的是redis.net.com/order/xxx.html

(如:Redis Setnx 命令_只有在 key 不存在时设置 key 的值。);

进入后,f12,进入开发者模式,选中左侧元素

可看到,我们需要爬取的内容是div标签下的class为left的数据,ul下的li下的a标签的 href元素,

这段对应的python为

req = requests.get(url="https://www.redis.net.cn/order/3552.html")  #使用get方式获取该网页的数据。实际上我们获取到的就是浏览器打开百度网址时候首页画面的数据信息
#print(req.text)   #把我们获取数据的文字(text)内容输出(print)出来
req.encoding = "utf-8"  #指定获取的网页内容,即第二句定义req的内容,用utf-8编码
html = req.text   #指定获取的网页内容,即第二句定义req的内容,用text
soup = BeautifulSoup(req.text,features="html.parser")  #用html解析器(parser)来分析我们requests得到的html文字内容,soup就是我们解析出来的结果
# 查找特定的div下的ul下的li下的a标签
div = soup.find('div',class_="left")
ul = div.find('ul')
li_list = ul.find_all('li')
href_list=[]
# 遍历li标签并获取a标签的href内容
for li in li_list:a = li.find('a')href = "https://www.redis.net.cn"+a['href']href_list.append(href)# print(href)
n=1;

于是乎,我们就获得了以下链接地址

2.分析每个链接下的网页结构

首先可分为以下几个结构

第一个为全局唯一的h1标签中的内容,并且处于div class为page-header中,因此代码为

div_title=soup.find('div',class_="page-header")h1_title=div_title.find('h1').text

语法段的信息获取

    pres = soup.find_all('pre', class_='prettyprint linenums')syntax=pres[0].text.strip()

简介版本返回值,分别都是h3标签下的数据

 h3_tag = soup.find_all('h3')introduction_tags = h3_tag[0].find_previous_siblings('p')introduction=""version=""return_value=""for p_tag in introduction_tags:introduction+=p_tag.text.strip()version_tags=h3_tag[1].find_next_sibling('p')for p_tag in version_tags:version+=p_tag.text.strip()return_tags=h3_tag[2].find_next_sibling('p')for p_tag in return_tags:return_value+=p_tag.text.strip()

示例段的数据获取

    pres = soup.find_all('pre', class_='prettyprint linenums')if len(pres) >=2:examples=pres[1].text.strip()else :examples = ""

3.markdown源代码生成

# 定义一个方法来生成Markdown内容
def generate_markdown(website_obj,n):markdown_content = "# "+str(n)+f".{website_obj.title}\n\n"markdown_content += f"## 简介\n```\n{website_obj.introduction}\n```\n\n"markdown_content += f"## 语法\n```\n{website_obj.syntax}\n```\n\n"markdown_content += f"### 可用版本: {website_obj.version}\n\n"markdown_content += f"### 返回值: {website_obj.return_value}\n\n"markdown_content += f"## 示例\n\n```shell\n"for example in website_obj.examples:markdown_content += f"{example}"markdown_content += "\n```\n"return markdown_content

4.完整示例

import requests   #导入我们需要的requests功能模块
from bs4 import BeautifulSoup  #使用BeautifulSoup这个功能模块来把充满尖括号的html数据变为更好用的格式,from bs4 import BeautifulSoup这个是说从bs4这个功能模块中导入BeautifulSoup,是的,因为bs4中包含了多个模块,BeautifulSoup只是其中一个
class Website:def __init__(self, href, title,syntax,examples,introduction,version,return_value):self.href = hrefself.title = titleself.syntax=syntaxself.examples=examplesself.introduction=introductionself.version=versionself.return_value=return_valuedef __str__(self):return f"Website(href={self.href}, title={self.title},syntax={self.syntax},examples={self.examples},introduction={self.introduction},version={self.version},return_value={self.return_value})"
# 定义一个方法来生成Markdown内容
def generate_markdown(website_obj,n):markdown_content = "# "+str(n)+f".{website_obj.title}\n\n"markdown_content += f"## 简介\n```\n{website_obj.introduction}\n```\n\n"markdown_content += f"## 语法\n```\n{website_obj.syntax}\n```\n\n"markdown_content += f"### 可用版本: {website_obj.version}\n\n"markdown_content += f"### 返回值: {website_obj.return_value}\n\n"markdown_content += f"## 示例\n\n```shell\n"for example in website_obj.examples:markdown_content += f"{example}"markdown_content += "\n```\n"return markdown_content
req = requests.get(url="https://www.redis.net.cn/order/3552.html")  #使用get方式获取该网页的数据。实际上我们获取到的就是浏览器打开百度网址时候首页画面的数据信息
#print(req.text)   #把我们获取数据的文字(text)内容输出(print)出来
req.encoding = "utf-8"  #指定获取的网页内容,即第二句定义req的内容,用utf-8编码
html = req.text   #指定获取的网页内容,即第二句定义req的内容,用text
soup = BeautifulSoup(req.text,features="html.parser")  #用html解析器(parser)来分析我们requests得到的html文字内容,soup就是我们解析出来的结果
# 查找特定的div下的ul下的li下的a标签
div = soup.find('div',class_="left")
ul = div.find('ul')
li_list = ul.find_all('li')
href_list=[]
# 遍历li标签并获取a标签的href内容
for li in li_list:a = li.find('a')href = "https://www.redis.net.cn"+a['href']href_list.append(href)# print(href)
n=1;
for hrefitem in href_list:req = requests.get(url=hrefitem)req.encoding = "utf-8"  # 指定获取的网页内容,即第二句定义req的内容,用utf-8编码html = req.text  # 指定获取的网页内容,即第二句定义req的内容,用textsoup = BeautifulSoup(req.text, features="html.parser")div_title=soup.find('div',class_="page-header")h1_title=div_title.find('h1').textpres = soup.find_all('pre', class_='prettyprint linenums')syntax=pres[0].text.strip()if len(pres) >=2:examples=pres[1].text.strip()else :examples = ""h3_tag = soup.find_all('h3')introduction_tags = h3_tag[0].find_previous_siblings('p')introduction=""version=""return_value=""for p_tag in introduction_tags:introduction+=p_tag.text.strip()version_tags=h3_tag[1].find_next_sibling('p')for p_tag in version_tags:version+=p_tag.text.strip()return_tags=h3_tag[2].find_next_sibling('p')for p_tag in return_tags:return_value+=p_tag.text.strip()website=Website(href,h1_title,syntax,examples,introduction,version,return_value)# print(introduction)# print(website.__str__())# 使用上述定义的方法生成Markdown源码markdown_source = generate_markdown(website,n)n=n+1print(markdown_source)

以上案例可将redis key命令篇的案例,爬取生成markdown代码,如果需要爬取多类代码,可修改

req = requests.get(url="https://www.redis.net.cn/order/3552.html") 中的url属性为你所想爬取的类型的一种命令的网址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/343557.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter--3.使用提取器进行接口关联

目录 1. 正则表达式提取器 1.1 提取单个数据 1.2 名词解释 1.3 提取多个数据 2. 边界值提取器 2.2 名词解释 3. JSON提取器 3.1 Json语法 3.2 名词解释 3.3 如果有多组数据,同正则方式引用数据 1. 正则表达式提取器 示例数据:{"access_to…

C#编程-实现线程声明周期

实现线程声明周期 当System.Threading.Thread类的对象被创建的时候,线程的生命周期开始。线程的生命周期在完成任务时结束。在线程的生命周期中有各种状态。这些状态是: 未启动状态可运行状态不可运行状态死亡状态下图显示了线程的各种状态和引起线程从一个状态变为另一个状…

Unity网络通讯学习

---部分截图来自 siki学院Unity网络通讯课程 Socket 网络上的两个程序通过一个双向的通信连接实现数据交换,这个连接的一端称为一个 Socket ,Socket 包含了网络通信必须的五种信息 Socket 例子{ 协议: TCP 本地: IP &#xff…

代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差

代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差 题目描述解题思路 & 代码实现递归法迭代法 题目描述 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 示例&#…

VUE element-ui实现表格动态展示、动态删减列、动态排序、动态搜索条件配置、表单组件化。

1、实现效果 1.1、文件目录 1.2、说明 1、本组件支持列表的表头自定义配置,checkbox实现 2、本组件支持列表列排序,vuedraggable是拖拽插件,上图中字段管理里的拖拽效果 ,需要的话请自行npm install 3、本组件支持查询条件动态…

【面试突击】注册中心面试实战

🌈🌈🌈🌈🌈🌈🌈🌈 欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

软件测评中心▏性能测试之压力测试、负载测试的区别和联系简析

在如今的信息时代,软件已经成为人们日常工作和生活不可或缺的一部分。然而,随着软件的发展和应用范围的不断扩大,软件性能的优劣也成为了影响用户使用体验的重要因素。 软件性能测试即对软件在不同条件下的性能进行评估和验证的过程。通过模…

Wpf 使用 Prism 实战开发Day11

仓储(Repository)/工作单元(Unit Of Work)模式 仓储(rep):仓储接口定义了对实体类访问数据库及操作的方法。它统一管理数据访问的逻辑,并与业务逻辑层进行解耦。 简单的理解就是对访问数据库的一…

Tensorflow2.0笔记 - 修改形状和维度

本次笔记主要使用reshape,transpose,expand_dim,和squeeze对tensor的形状和维度进行操作。 import tensorflow as tf import numpy as nptf.__version__#tensor的shape和维数获取 #假设下面这个tensor表示4张28*28*3的图片 tensor tf.rando…

开发代码基础

首先安装驱动,在ARDUINO环境下安装,然后安装开发板,详见哔哩哔哩教程 1:接入点模式(也称 AP) 通过以下示例程序,NodeMCU将会建立一个名为taichi-maker的WiFI。您可以使用手机或电脑连接该WiFi…

Spark的内核调度

目录 概述 RDD的依赖 DAG和Stage DAG执行流程图形成和Stage划分 Stage内部流程 Spark Shuffle Spark中shuffle的发展历程 优化前的Hash shuffle 经过优化后的Hash shuffle Sort shuffle Sort shuffle的普通机制 Job调度流程 Spark RDD并行度 概述 Spark内核调度任务: 1…

U盘启动安装win11遇到缺少计算机所需的介质驱动程序问题

一、使用U盘制作启动盘遇到问题 下载了windows原版镜像,验证了md5,确保文件没有损坏。使用ultroiso制作u盘启动盘,开始安装后出现下图的报错: 在网上搜索解决方案,主要有以下几种: 安装的时候&#xff0c…