Skip to main content

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

Updated 5 min readMarkdown
Part of seriesAI Copilot
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文件的第一行。在标题之后,正文内容将从新的一行开始。您可以根据需要自定义其它细节。如果需要进一步的帮助,请随时告诉我。

No comments yet. Be the first to comment.

More from this blog