Skip to main content

Command Palette

Search for a command to run...

ChatGPT没有帮我写出文章,但是帮我写代码意外的好用

Updated
5 min read
ChatGPT没有帮我写出文章,但是帮我写代码意外的好用

搞代码不是我的擅长,但是我日常工作中的一些小需求,已经不需要从头开始学代码了,安装一个Python环境和一些库,就可以用人类自然语言来和ChatGPT4提需求,已经通过回复系统提示来调试代码。

以下是一个成功的例子,有兴趣可以看看我是怎么用“嘴”调试代码的。

这些代码的功能,是我把一堆URL放到一个txt文档里,然后代码会挨个打开这些网页,然后把正文保存到txt文件里,为了能以后还能追踪这个网页,URL还会写在txt文件的第一行,然后标题隔一行开始。

# ChatGPT4 对话记录

> 导出时间: 2023-05-27 16:22:02 +08:00

## 如何批量将URL下载到本地,只保留正文部分

> You are ChatGPT, a large language model trained by OpenAI. Follow the user's instructions carefully. Respond using markdown.

**你:**
如何批量将URL下载到本地,只保留正文部分

**ChatGPT4:**
批量将URL下载到本地并只保留正文部分,可以通过编写一个Python脚本实现。这里以使用 `requests``beautifulsoup4` 库为例。安装所需库:

```
pip install requests
pip install beautifulsoup4
```

然后,按照以下步骤执行操作:

1. 在一个文本文件中(如 `input_urls.txt`)存储所需下载的URL,每行一个链接。
2. 编写Python脚本,读取这个文本文件,下载并提取正文。

```python
import requests
from bs4 import BeautifulSoup

# 读取input_urls.txt文件里的所有URL
with open('input_urls.txt', 'r') as f:
    urls = f.readlines()

#遍历URLs, 下载并提取正文部分
for i, url in enumerate(urls):
    url = url.strip()

    try:
        # 请求URL
        response = requests.get(url)

        # 检查是否成功请求
        if response.status_code != 200:
            print(f"请求失败:{url}")
            continue

        # BeautifulSoup解析
        soup = BeautifulSoup(response.content, 'html.parser')

        # 获取正文内容(根据具体网页的情况,可能需要修改这部分)
        main_content = soup.find('body')

        # 保存正文内容到本地文件
        with open(f'output_{i}.txt', 'w') as outfile:
            outfile.write(main_content.get_text())

        print(f"成功保存:{url}")

    except Exception as e:
        print(f"处理 {url} 时发生异常: {e}")
```

运行此脚本,URL会被逐个访问并下载。正文内容(html中的 body 部分)将被提取并以普通文本格式(output_x.txt)保存到本地。注意:根据实际网页情况,提取正文内容的方式可能有所不同,因此可能需要针对不同网页进行相应的调整。

**你:**
系统提示
FileNotFoundError: [Errno 2] No such file or directory: 'input_urls.txt'

**ChatGPT4:**
这个错误提示是因为Python脚本未能在当前运行目录中找到名为`input_urls.txt`的文件。请确保以下几点:

1. 创建一个名为`input_urls.txt`的文件(注意大小写和文件扩展名)。
2. 确保将`input_urls.txt`文件与你的Python脚本保存在相同的目录中。
3. 确保在这个目录中运行Python脚本。

这是一个示例,创建一个名为`input_urls.txt`的文件,并在其中添加几个链接:

```
https://www.example1.com
https://www.example2.com
https://www.example3.com
```

然后,确保Python脚本在与此文件相同的目录中运行。如果错误仍然出现,请检查目录路径和文件名是否输入正确。

如果要指定文件的全路径,你可以像这样修改脚本中读取文件的部分:

```python
import os

# 指定文件全路径
file_path = os.path.abspath('input_urls.txt')

# 读取input_urls.txt文件里的所有URL
with open(file_path, 'r') as f:
    urls = f.readlines()
```

请确保将`input_urls.txt`的文件路径替换为正确的路径。然后,运行脚本。

**你:**
问题解决了,请帮我进一步完善代码。要求txt文件开头,写上URL地址。文件名格式“网页标题.txt”

**ChatGPT4:**
根据您的要求,我们需要修改脚本以保存文件时包含URL地址和使用网页标题作为文件名。以下是修改后的脚本:

```python
import requests
from bs4 import BeautifulSoup
import os

# 读取input_urls.txt文件里的所有URL
with open('input_urls.txt', 'r') as f:
    urls = f.readlines()

# 遍历URLs, 下载并提取正文部分
for url in urls:
    url = url.strip()

    try:
        # 请求URL
        response = requests.get(url)

        # 检查是否成功请求
        if response.status_code != 200:
            print(f"请求失败:{url}")
            continue

        # BeautifulSoup解析
        soup = BeautifulSoup(response.content, 'html.parser')

        # 获取网页标题
        title = soup.title.string.strip() if soup.title else "Untitled"

        # 替换网页标题中的非法字符
        valid_filename_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
        title = ''.join(c for c in title if c in valid_filename_chars)

        # 获取正文内容(根据具体网页的情况,可能需要修改这部分)
        main_content = soup.find('body')

        # 保存正文内容到本地文件
        with open(f'{title}.txt', 'w') as outfile:
            outfile.write(f"原文链接:{url}\n\n")
            outfile.write(main_content.get_text())

        print(f"成功保存:{url}")

    except Exception as e:
        print(f"处理 {url} 时发生异常: {e}")
```

根据您的要求,脚本在每个输出文件的开头添加了URL地址。此外,它还提取了网页标题,并将其用作输出文件名。请注意,我们还替换了标题中的非法文件名字符,以避免保存文件时出现问题。

再次运行该脚本,您会发现输出文件的文件名格式为“网页标题.txt”,并且正文内容之前包含了原始URL地址。如果有任何问题,请随时告诉我。

**你:**
系统提示
时发生异常: name 'string' is not defined

**ChatGPT4:**
非常抱歉,我在之前的回答中忘记导入 `string` 模块了。请在脚本开始部分添加 `import string`。以下是修复后的完整脚本:

```python
import requests
from bs4 import BeautifulSoup
import os
import string

# 读取input_urls.txt文件里的所有URL
with open('input_urls.txt', 'r') as f:
    urls = f.readlines()

# 遍历URLs, 下载并提取正文部分
for url in urls:
    url = url.strip()

    try:
        # 请求URL
        response = requests.get(url)

        # 检查是否成功请求
        if response.status_code != 200:
            print(f"请求失败:{url}")
            continue

        # BeautifulSoup解析
        soup = BeautifulSoup(response.content, 'html.parser')

        # 获取网页标题
        title = soup.title.string.strip() if soup.title else "Untitled"

        # 替换网页标题中的非法字符
        valid_filename_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
        title = ''.join(c for c in title if c in valid_filename_chars)

        # 获取正文内容(根据具体网页的情况,可能需要修改这部分)
        main_content = soup.find('body')

        # 保存正文内容到本地文件
        with open(f'{title}.txt', 'w') as outfile:
            outfile.write(f"原文链接:{url}\n\n")
            outfile.write(main_content.get_text())

        print(f"成功保存:{url}")

    except Exception as e:
        print(f"处理 {url} 时发生异常: {e}")
```

现在运行修改后的脚本应该不会出现此类问题。如果您还遇到其他问题,请随时告诉我。

**你:**
已经成功运行了,但是txt文件中的内容没有分段,是否可以改善代码,保留原有网页正文中的分段。

**ChatGPT4:**
为了保留原始网页正文的分段,我们可以修改代码中提取正文内容的部分。请注意,不同的网页可能使用不同的标签来表示正文和段落。在此示例中,我们假设正文中的段落由`<p>`标签表示。您可能需要根据要下载的特定网页进行调整。

以下是修改后的脚本:

```python
import requests
from bs4 import BeautifulSoup
import os
import string

# 读取input_urls.txt文件里的所有URL
with open('input_urls.txt', 'r') as f:
    urls = f.readlines()

# 遍历URLs, 下载并提取正文部分
for url in urls:
    url = url.strip()

    try:
        # 请求URL
        response = requests.get(url)

        # 检查是否成功请求
        if response.status_code != 200:
            print(f"请求失败:{url}")
            continue

        # BeautifulSoup解析
        soup = BeautifulSoup(response.content, 'html.parser')

        # 获取网页标题
        title = soup.title.string.strip() if soup.title else "Untitled"

        # 替换网页标题中的非法字符
        valid_filename_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
        title = ''.join(c for c in title if c in valid_filename_chars)

        # 获取正文内容(根据具体网页的情况,可能需要修改这部分)
        main_content = soup.find('body')

        # 提取正文中的段落并保存到本地文件
        with open(f'{title}.txt', 'w') as outfile:
            outfile.write(f"原文链接:{url}\n\n")
            paragraphs = main_content.find_all('p')
            for paragraph in paragraphs:
                outfile.write(paragraph.get_text() + "\n\n")

        print(f"成功保存:{url}")

    except Exception as e:
        print(f"处理 {url} 时发生异常: {e}")
```

在这个修改后的脚本中,我们首先为正文内容下的所有`<p>`标签找到段落,并分别添加到输出文件中,同时在段落之间保留空行。这样,您在输出的txt文件中就能看到原始正文的分段了。如果需要进一步帮助,请随时告诉我。

**你:**
可以正常运行,请帮我改善代码。把网页的标题也写在txt文件中,位置是URL之后另一起行,在正文之前

**ChatGPT4:**
根据您的要求,我们可以在保存正文内容之前将标题写入输出文件。以下是修改后的脚本:

```python
import requests
from bs4 import BeautifulSoup
import os
import string

# 读取input_urls.txt文件里的所有URL
with open('input_urls.txt', 'r') as f:
    urls = f.readlines()

# 遍历URLs, 下载并提取正文部分
for url in urls:
    url = url.strip()

    try:
        # 请求URL
        response = requests.get(url)

        # 检查是否成功请求
        if response.status_code != 200:
            print(f"请求失败:{url}")
            continue

        # BeautifulSoup解析
        soup = BeautifulSoup(response.content, 'html.parser')

        # 获取网页标题
        title = soup.title.string.strip() if soup.title else "Untitled"

        # 替换网页标题中的非法字符
        valid_filename_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
        title = ''.join(c for c in title if c in valid_filename_chars)

        # 获取正文内容(根据具体网页的情况,可能需要修改这部分)
        main_content = soup.find('body')

        # 提取正文中的段落并保存到本地文件
        with open(f'{title}.txt', 'w') as outfile:
            outfile.write(f"原文链接:{url}\n\n")
            outfile.write(f"标题:{title}\n\n")  # 将标题写入输出文件
            paragraphs = main_content.find_all('p')
            for paragraph in paragraphs:
                outfile.write(paragraph.get_text() + "\n\n")

        print(f"成功保存:{url}")

    except Exception as e:
        print(f"处理 {url} 时发生异常: {e}")
```

现在,在输出文件中,URL和正文之间另起一行写入了标题。在运行此脚本后,您会在每个输出文件中看到`原文链接``标题`和正文内容。如果您需要进一步的帮助,请随时告诉我。

**你:**
可以运行,但是发现一个问题,中文标题没有被正确识别出来,是否可以改善代码支持中文

**ChatGPT4:**
为了让脚本正确处理中文标题,我们需要修改用于替换网页标题中的非法字符的部分。这是修改后的脚本:

```python
import requests
from bs4 import BeautifulSoup
import os
import string
import re

# 读取input_urls.txt文件里的所有URL
with open('input_urls.txt', 'r') as f:
    urls = f.readlines()

# 遍历URLs, 下载并提取正文部分
for url in urls:
    url = url.strip()

    try:
        # 请求URL
        response = requests.get(url)

        # 检查是否成功请求
        if response.status_code != 200:
            print(f"请求失败:{url}")
            continue

        # BeautifulSoup解析
        soup = BeautifulSoup(response.content, 'html.parser')

        # 获取网页标题
        title = soup.title.string.strip() if soup.title else "Untitled"

        # 替换网页标题中的非法字符
        valid_filename_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
        title = re.sub(r'[^\w\s-_\u4e00-\u9fa5]', '', title)  # 支持中文

        # 获取正文内容(根据具体网页的情况,可能需要修改这部分)
        main_content = soup.find('body')

        # 提取正文中的段落并保存到本地文件
        with open(f'{title}.txt', 'w') as outfile:
            outfile.write(f"原文链接:{url}\n\n")
            outfile.write(f"标题:{title}\n\n")  # 将标题写入输出文件
            paragraphs = main_content.find_all('p')
            for paragraph in paragraphs:
                outfile.write(paragraph.get_text() + "\n\n")

        print(f"成功保存:{url}")

    except Exception as e:
        print(f"处理 {url} 时发生异常: {e}")
```

在修改后的脚本中,我们使用正则表达式`re.sub()`来替换标题中的非法字符,同时允许中文字符。这样,脚本应该能正确处理包含中文的标题。

结果输出文件将包含正确识别的中文标题。如果您需要进一步的帮助,请随时告诉我。

**你:**
系统提示
发生异常: bad character range \s-_ at position 4

**ChatGPT4:**
抱歉给您带来了困扰。异常是由于正则表达式中的连字符没有被正确处理。请使用下面修改过的正则表达式:

```python
title = re.sub(r'[^\w\s\-_\u4e00-\u9fa5]', '', title)  # 支持中文
```

这是修正后的完整脚本:

```python
import requests
from bs4 import BeautifulSoup
import os
import string
import re

# 读取input_urls.txt文件里的所有URL
with open('input_urls.txt', 'r') as f:
    urls = f.readlines()

# 遍历URLs, 下载并提取正文部分
for url in urls:
    url = url.strip()

    try:
        # 请求URL
        response = requests.get(url)

        # 检查是否成功请求
        if response.status_code != 200:
            print(f"请求失败:{url}")
            continue

        # BeautifulSoup解析
        soup = BeautifulSoup(response.content, 'html.parser')

        # 获取网页标题
        title = soup.title.string.strip() if soup.title else "Untitled"

        # 替换网页标题中的非法字符
        title = re.sub(r'[^\w\s\-_\u4e00-\u9fa5]', '', title)  # 支持中文

        # 获取正文内容(根据具体网页的情况,可能需要修改这部分)
        main_content = soup.find('body')

        # 提取正文中的段落并保存到本地文件
        with open(f'{title}.txt', 'w') as outfile:
            outfile.write(f"原文链接:{url}\n\n")
            outfile.write(f"标题:{title}\n\n")  # 将标题写入输出文件
            paragraphs = main_content.find_all('p')
            for paragraph in paragraphs:
                outfile.write(paragraph.get_text() + "\n\n")

        print(f"成功保存:{url}")

    except Exception as e:
        print(f"处理 {url} 时发生异常: {e}")
```

现在运行这个修改后的脚本,它应该正常处理含有中文的标题,不再出现异常。如有任何问题,请随时告诉我。

**你:**
已经可以完美运行了。我另外有一个需求,基于这段代码,改造成遍历脚本所在的目录,将所有的html文件转换为txt文件。

**ChatGPT4:**
为了将此脚本改造成遍历当前目录,并将所有的html文件转换为txt文件,您可以按照以下步骤操作:

1. 使用 `os` 库列出当前目录下的所有文件。
2. 筛选出扩展名为 `.html` 的文件。
3. 对于每个html文件,执行类似的内容提取操作,并将输出保存为txt文件。

以下是改造后的脚本:

```python
import requests
from bs4 import BeautifulSoup
import os
import string
import re

# 列出当前目录下的所有文件
files_in_directory = os.listdir()
html_files = [file for file in files_in_directory if file.endswith(".html")]

# 遍历所有html文件
for html_file in html_files:
    with open(html_file, 'r', encoding='utf-8') as f:
        content = f.read()

        try:
            # BeautifulSoup解析
            soup = BeautifulSoup(content, 'html.parser')

            # 获取网页标题
            title = soup.title.string.strip() if soup.title else "Untitled"

            # 替换网页标题中的非法字符
            title = re.sub(r'[^\w\s\-_\u4e00-\u9fa5]', '', title)  # 支持中文

            # 获取正文内容(根据具体网页的情况,可能需要修改这部分)
            main_content = soup.find('body')

            # 提取正文中的段落并保存到本地文件
            with open(f'{title}.txt', 'w') as outfile:
                paragraphs = main_content.find_all('p')
                for paragraph in paragraphs:
                    outfile.write(paragraph.get_text() + "\n\n")

            print(f"成功保存:{html_file}")

        except Exception as e:
            print(f"处理 {html_file} 时发生异常: {e}")
```

现在,当您在包含html文件的目录中运行此脚本时,它将遍历目录,逐个提取html文件的正文内容,并将其保存为.txt文件。

注意:这个脚本假设所有的html文件都是utf-8编码。如有需要,请根据实际情况调整文件编码。

如果您需要进一步的帮助,请随时告诉我。

**你:**
代码运行的很完美,有一个需要完善的地方,请将网页标题写入txt文件的第一行,正文另起一行。

**ChatGPT4:**
根据您的要求,以下是修改后的脚本,将网页标题写入txt文件的第一行,正文另起一行:

```python
import requests
from bs4 import BeautifulSoup
import os
import string
import re

# 列出当前目录下的所有文件
files_in_directory = os.listdir()
html_files = [file for file in files_in_directory if file.endswith(".html")]

# 遍历所有html文件
for html_file in html_files:
    with open(html_file, 'r', encoding='utf-8') as f:
        content = f.read()

        try:
            # BeautifulSoup解析
            soup = BeautifulSoup(content, 'html.parser')

            # 获取网页标题
            title = soup.title.string.strip() if soup.title else "Untitled"

            # 替换网页标题中的非法字符
            title = re.sub(r'[^\w\s\-_\u4e00-\u9fa5]', '', title)  # 支持中文

            # 获取正文内容(根据具体网页的情况,可能需要修改这部分)
            main_content = soup.find('body')

            # 提取正文中的段落并保存到本地文件
            with open(f'{title}.txt', 'w') as outfile:
                outfile.write(f"{title}\n\n")  # 将标题写入输出文件的第一行
                paragraphs = main_content.find_all('p')
                for paragraph in paragraphs:
                    outfile.write(paragraph.get_text() + "\n\n")

            print(f"成功保存:{html_file}")

        except Exception as e:
            print(f"处理 {html_file} 时发生异常: {e}")
```

该脚本现在会将网页的标题直接写入每个输出txt文件的第一行。在标题之后,正文内容将从新的一行开始。您可以根据需要自定义其它细节。如果需要进一步的帮助,请随时告诉我。

More from this blog

血型新发现,远超想象的奥秘

1972年,一位孕妇的血液样本让医生们大吃一惊。他们发现她的红细胞表面缺少了一种当时所有已知血液中都存在的分子。这个发现开启了一段长达50年的血型之谜。 血型的发现之路 血型,这个看似简单的概念背后,隐藏着许多有趣的故事。我们最熟悉的是ABO血型系统和Rh因子(也就是"+"或"-"号)。但实际上,人类有47种血型系统!每种系统都像红细胞表面的特殊标记,帮助免疫系统识别"自己人"和"外来者"。 这些标记是如何被发现的?要追溯到1900年,奥地利医生兰德斯坦纳做了一个简单却重要的实验。他将实验室成员...

Jan 6, 20251 min read
血型新发现,远超想象的奥秘

世界奇妙导航记:五种令人惊叹的指路方式

请谨慎对待以下内容,本文由Claude-3.5-Sonnet撰写,没有做事实核查。 你有没有想过,在没有手机导航的时候,人们是怎么找路的?今天就让我们一起去探索世界上最有趣的五种导航方式吧! **蜜蜂:**会跳舞的小导航员 想象一下,在漆黑的蜂巢里,一只找到美食的蜜蜂正在跳一支特别的舞!科学家们把它叫做"摇摆舞"。小蜜蜂会扭动自己的身体,用舞蹈的角度告诉同伴食物在太阳的哪个方向,用舞蹈的时间长短表示距离有多远。更神奇的是,即使是阴天,蜜蜂也能根据太阳的移动调整自己的舞步!这个发现让科学家卡尔·...

Nov 27, 20241 min read

查阅世界各国历史边界 Old Maps Online

https://www.oldmapsonline.org/ “Old Maps Online”网站就像一个大型的互动版维基百科,可以让你浏览不同历史时期世界各地的地图边界变化。 通过这个网站,你可以看到不同时期制作的地图,了解当时人们对边界的认知,甚至能看到1950年代的旅游指南等各种地图。 你可以轻松地发现许多鲜为人知的历史知识,例如俄勒冈州、华盛顿州和不列颠哥伦比亚省曾由英美两国共同管辖近30年。 该网站还能提供有用的文化背景信息,方便你进行国际旅行前的准备。 通过滑动时间轴,你...

Nov 6, 20241 min read
查阅世界各国历史边界 Old Maps Online

[ai草稿]惊人发现!科学家破译抹香鲸的"字母表"

å注意:本文完全由人工智能创作,未经事实核查和编辑。 在浩瀚的海洋深处,体型庞大的抹香鲸正在进行着神秘的"对话"。这些海洋巨兽可以潜入3000米的深海,在黑暗中捕食巨型鱿鱼。它们独特的方形头部内藏有地球上最大的大脑,重达8公斤,比人类大脑重六倍多。最近,科学家们有了一个激动人心的发现:这些神秘的海洋生物可能拥有自己的"字母表"! 抹香鲸通过发出一连串奇特的"咔嗒"声来交流。这些声音组合被称为"coda",是抹香鲸语言的基本单元,类似于人类语言中的音节。当抹香鲸发出这些声音时,它们会使用头部的脂肪...

Jul 3, 20241 min read
[ai草稿]惊人发现!科学家破译抹香鲸的"字母表"

爱因斯坦的大脑:神秘的旅程与科学的探索

导读 爱因斯坦的遗愿是火葬,骨灰撒在秘密地点,不想被膜拜和封神。 病理学家哈维擅自保留了爱因斯坦的大脑,引发了争议和纠纷。 爱因斯坦的大脑被切成240块进行研究。 研究人员计划通过解剖学的方式检视爱因斯坦的大脑,并寻找与其他大脑的不同之处。 爱因斯坦的大脑,这颗曾孕育出无数革命性理论的脑袋,如同其主人一般,成为了科学界的一个永恒之谜。人们对于这颗大脑的痴迷,既源于对爱因斯坦个人的崇敬,也源于对人类智慧之源的探寻。 爱因斯坦在世时,就明确表示他希望自己死后火化,骨灰撒在秘密的地方,以免...

Aug 23, 20231 min read
爱因斯坦的大脑:神秘的旅程与科学的探索

半只土豆|漫话科学笔记

11 posts

科普什么值得写