python 爬虫 生成markdown文档

news2024/11/17 23:43:14

本文介绍的案例为使用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 = href
        self.title = title
        self.syntax=syntax
        self.examples=examples
        self.introduction=introduction
        self.version=version
        self.return_value=return_value

    def __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的内容,用text
    soup = BeautifulSoup(req.text, features="html.parser")
    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()
    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+1
    print(markdown_source)



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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win系统搭建Minecraft世界服务器,MC开服教程,小白开服教程

Windows系统搭建我的世界世界服务器,Minecraft开服教程,小白开服教程,MC 1.19.4版本服务器搭建教程。 此教程使用 Mohist 1.19.4 服务端,此服务端支持Forge模组和Bukkit/Spigot/Paper插件,如果需要开其他服务端也可参…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子详情实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

使用 Jamf Pro 和 Okta 工作流程实现自动化苹果设备管理

Jamf的销售工程师Vincent Bonnin与Okta的产品经理Emily Wendell一起介绍了JNUC 2021的操作方法会议。它们涵盖了Okta工作流程(Okta Workflow),并在其中集成了Jamf Pro,构建了一些工作流程,并提供了几个用例。 Okta 工作…

【密码学】python密码学库pycryptodome

记录了一本几乎是10年前的书(python绝技–用python成为顶级黑客)中过时的内容 p20 UNIX口令破解机 里面提到了python标准库中自带的crypt库,经验证Python 3.12.1中并没有这个自带的库,密码学相关的库目前(2024.1.12&a…

Unity中URP下实现能量罩(外发光)

文章目录 前言一、实现菲涅尔效果1、求 N ⃗ \vec{N} N 2、求 V ⃗ \vec{V} V 3、得出菲涅尔效果4、得出菲涅尔相反效果5、增加菲涅尔颜色 二、能量罩 交接处高亮 和 外发光效果结合1、修改混合模式,使能量罩透明2、限制 0 ≤ H i g h L i g h t C o l o r ≤ 1 …

002 Golang-channel-practice

第二题: 创建一个生产器和接收器,再建立一个无缓冲的channel。生产器负责把数据放进管道里,接收器负责把管道里面的数据打印出来。这里我们开5个协程把数据打印出来。 直接上代码! package mainimport ("fmt" )func …

常见的硬件设计相关网站和资料

以下是一些常见的硬件设计相关网站和资料: Arduino官方网站:https://www.arduino.cc/ - Arduino是一款流行的开源硬件平台,官方网站提供了大量的教程、项目示例和文档,适合初学者和专业人士。 2. TI(德州仪器&#xf…

AI RAG应用的多种文档分块代码

在开发 RAG 应用程序时,重要的是要有一个完善的文档分块模式来攫取内容。虽然有很多库可以实现这一目标,但重要的是要了解这一过程的基本机制,因为它是 AI RAG 应用程序的基石。 欢迎关注公众号(NLP Research) 测试文档 在测试文档中,我们将使用亚马逊文档中的大型 PDF…

写一个简单的Java的Gui文本输入窗口,JFrame的简单使用

JFrame是指一个计算机语言-java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。 Swing的三个基本构造块:标签、按钮和文本字段;但是需要个地方安放它们,并希望用户知道如何处理它们。JFrame 类就是解决这个问题的——它是一个容器…

Ubuntu 20.04 Intel RealSense D435i 相机标定教程

下载编译code_utils mkdir -p ~/imu_catkin_ws/src cd ~/imu_catkin_ws/src catkin_init_workspace source ~/imu_catkin_ws/devel/setup.bash git clone https://github.com/gaowenliang/code_utils.git cd .. catkin_make报错:sumpixel_test.cpp:2:10: fatal err…

芯课堂 | 固件升级方法及架构

本次介绍一种固件升级方法及架构。 所述方法通过运行引导加载程序,并基于引导加载程序,获取启动引导标志位; 在启动引导标志位为预设枚举标志位时,执行对应启动引导标志位的固件升级动作; 在启动引导标志位为非预设…

Windows下安装部署Redis

一、下载 地址:https://github.com/MSOpenTech/redis/releases Redis-x64-3.2.100.msi版的比较简单,下载之后直接下一步,下一步… 即可完成安装部署。 这里主要演示Redis-x64-3.2.100.zip的安装部署过程,将Redis-x64-3.2.100.z…

查看navicat链接密码

导出链接,带密码导出 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/239bcf0ad22d4de98524fa4d7db4a30d.png 查看密码 这个是navicat加密后的密码,需要解密 使用一段代码解密 这个是php代码,没有本地php环境,可以看在线…

103、GAUDI: A Neural Architect for Immersive 3D Scene Generation

简介 github GAUDI在多个数据集的无条件生成环境中获得了最先进的性能,并允许在给定条件变量(如稀疏图像观察或描述场景的文本)的情况下有条件地生成3D场景。 实现流程 目标是在给定3D场景中轨迹经验分布的情况下,学习一个生成模型,设 X …

golang 反序列化出现json: cannot unmarshal string into Go value of type model.Phone

项目场景: 今天在项目公关的过程中,需要对interface{}类型进行转换为具体结构体 问题描述 很自然的用到了resultBytes, _ : json.Marshal(result),然后对resultBytes进行反序列化转换为对应的结构体err : json.Unmarshal(resultBytes, &…

【scala】编译build报错 “xxx is not an enclosing class“

private[sources] val creationTimeMs: Long {val session SparkSession.getActiveSession.orElse(SparkSession.getDefaultSession)require(session.isDefined)private[xxx]是访问权限控制在xxxx包的意思。 解决办法: 把[sources]删掉,或者改成和包名…

C语言——(一维数组基础知识)

简介 本内容主要介绍了数组如何初始化,以及存储等知识点。 一.数组的概念 1.数组是相同类型元素的集合 2.数组中可以存放一个或者多个数据,但是个数不能为0 3.数组中存放的元素类型是相同的 二.数组的创建和初始化 1.数组的创建 type arr_name[常量值…

浅研究下 DHCP 和 chrony

服务程序: 1.如果有默认配置,请先备份,再进行修改 2.修改完配置文件,请重启服务或重新加载配置文件,否则不生效 有些软件,安装包的名字和系统里服务程序的名字不一样(安装包名字:…

GitLab 502 Whoops, GitLab is taking too much time to respond. 解决

1、先通过gitlab-ctl restart进行重启,2分钟后看是否可以正常访问,为什么要2分钟,因为gitlab启动会有很多配套的服务启动,包括postgresql等 2、如果上面不行,再看gitlab日志,通过gitlab-ctl tail命令查看&…

FineBI实战项目一(19):每小时订单笔数分析开发

点击新建组件,创建下每小时订单笔数组件。 选择饼图,拖拽cnt(总数)到角度,拖拽hourstr到颜色,调节内径。 修改现在的文字 拖拽组件到仪表盘。 效果如下: