在for循环中写入多个文件

Write multiple files inside for-loop

我正在尝试抓取多个 link,提取在 <p> HTML 标记上找到的文本并将输出写入不同的文件。每个 link 都应该有自己的输出文件。到目前为止:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import re
import csv
import pyperclip
import pprint
import requests

urls = ['https://link1',
        'https://link2']
url_list = list(urls)

#scrape elements
for url in urls:
    response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
    soup = BeautifulSoup(response.content, "html.parser")
    page = soup.find_all('p')
    page = soup.getText()
for line in urls:
    with open('filename{}.txt'.format(line), 'w', encoding="utf8") as outfile:
        outfile.write('\n'.join([i for i in page.split('\n') if len(i) > 0]))

我得到 OSError: [Errno 22] Invalid argument: filenamehttps://link1

如果我把我的代码改成这样

for index, line in enumerate(urls):
    with open('filename{}.txt'.format(index), 'w', encoding="utf8") as outfile:
        outfile.write('\n'.join([i for i in page.split('\n') if len(i) > 0]))

脚本运行但出现语义错误;两个输出文件都包含从 link2 中提取的文本。我想第二个 for 循环就是这样做的。

我研究了 S/O 类似的 1 答案,但我想不出来。

我猜您使用的是某种 *nix 系统,因为错误与 / 解释了路径的一部分有关。

因此,您必须采取措施正确命名文件或创建要保存输出的路径。

话虽如此,由于上述错误,使用 URL 作为文件名并不是一个好主意。

您可以将 / 替换为 _ 或者只是以不同的方式命名您的文件。

还有这个:

urls = ['https://link1',
        'https://link2']

已经是一个列表,所以不需要这个:

url_list = list(urls)

而且不需要两个 for loops。您可以在从列表中抓取 URLS 时写入文件。

这是一些虚拟网站的工作代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup

urls = ['https://lipsum.com/', 'https://de.lipsum.com/']

for url in urls:
    response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
    soup = BeautifulSoup(response.content, "html.parser")
    page = soup.find("div", {"id": "Panes"}).find("p").getText()
    with open('filename_{}.txt'.format(url.replace("/", "_")), 'w', encoding="utf8") as outfile:
        outfile.write('\n'.join([i for i in page.split('\n') if len(i) > 0]))

您也可以将您的方法用于 enumerate():

import requests
from bs4 import BeautifulSoup

urls = ['https://lipsum.com/', 'https://de.lipsum.com/']

for index, url in enumerate(urls, start=1):
    response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
    soup = BeautifulSoup(response.content, "html.parser")
    page = soup.find("div", {"id": "Panes"}).find("p").getText()
    with open('filename_{}.txt'.format(index), 'w', encoding="utf8") as outfile:
        outfile.write('\n'.join([i for i in page.split('\n') if len(i) > 0]))