在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]))
我正在尝试抓取多个 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]))