簡體   English   中英

在for循環中寫入多個文件

[英]Write multiple files inside for-loop

我正在嘗試抓取幾個鏈接,提取在<p> HTML 標記上找到的文本,並將 output 寫入不同的文件。 每個鏈接都應該有自己的 output 文件。 至今:

#!/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]))

腳本運行,但出現語義錯誤; output 文件都包含從鏈接 2 中提取的文本。 我猜第二個 for 循環就是這樣做的。

我已經研究了 S/O 以獲得類似的1 個答案,但我無法弄清楚。

我猜你在某種*nix系統上,因為錯誤與/解釋了路徑的一部分有關。

因此,您必須做一些事情來正確命名文件或創建要保存 output 的路徑。

話雖如此,由於上述錯誤,使用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]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM