python 爬虫 生成markdown文档

news/2024/7/19 11:40:41 标签: python, 爬虫, 开发语言

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

1.分析总网页的结构

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

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

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

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

这段对应的python

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中,因此代码为

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

语法段的信息获取

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

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

python"> 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()

示例段的数据获取

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

3.markdown源代码生成

python"># 定义一个方法来生成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.完整示例

python">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.niftyadmin.cn/n/5319472.html

相关文章

编译和链接(1)

目录 1. 程序的翻译环境和执行环境 2. 详解编译链接 2.1 翻译环境 2.2 编译本身也分为几个阶段: 2.3 运行环境 3. 预处理详解 3.1 预定义符号 3.2 #define 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 3.2.3 #define 替换规则 3.2.4 #和## 1. 程序的翻译环境和执…

Redis相关报错信息:Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接。

报错信息: Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接。 报错原因: 访问不到Redis服务 解决方案: 将Redis服务打开! 使用cmd命令行打开本机服务管理: services…

Vue中使用require.context()自动引入组件和自动引入组件的方法介绍

目录 一、自动引入组件 1、语法 2、使用 2.1、在compoents文件下随便创建index.js文件 2.2、mian.js引入该js 二、自动生成路由 1、示例: 2、使用 2.1、在router文件下随便创建autoRouter.js文件 2.2、在router文件下index.js文件中引入autoRouter.js文件…

42道Java网络编程相关面试题含答案(很全)

点击下载《42道Java网络编程相关面试题含答案(很全)》 1. 什么是网络编程 网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给其他设备,然后接受另外一个设备反馈的数据。现…

操作系统(简答题)

注意!!!下列只是“一些(or 一部分)” 如果想要都会click this 选择、填空、判断click this 1. 操作系统的基本特性有哪些?什么是实时系统? 操作系统的基本特性有: 并发(Concurre…

LInux初学之路linux的磁盘分区/远程控制/以及关闭图形界面/查看个人身份

虚拟机磁盘分配 hostname -I 查看ip地址 ssh root虚拟就ip 远程连接 win10之后才有 远程控制重新启动 reboot xshell 使用(个人和家庭版 免费去官方下载) init 3 关闭界面 减小内存使用空间 init 5 回复图形界面 runlevel显示的是状态 此时和上…

【数值分析】非线性方程求根,牛顿法,牛顿下山法,matlab实现

4. 牛顿法 收敛时牛顿法的收敛速度是二阶的,不低于二阶。如果函数有重根,牛顿法一般不是二阶收敛的。 x k 1 x k − f ( x k ) f ′ ( x k ) x_{k1}x_k- \frac{f(x_k)}{f(x_k)} xk1​xk​−f′(xk​)f(xk​)​ matlab实现 %% 牛顿迭代例子 f (x) x…

FPGA UDP协议栈:基于88E1111,支持RGMII、GMII、SGMII三种模式,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本本协议栈的 25G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设…