Python 从列表中删除元素
从Python 从列表中删除元素,python,python-3.x,list,web,Python,Python 3.x,List,Web,从列表中删除元素时遇到问题。发送电子邮件时,我想从url[]和prices[]中删除相关元素 例如,如果电子邮件有:像urlaiphonex和price 500€并且已经发送,我想重写url[]和prices[]中的元素,删除Iphone的url和500€ import requests from bs4 import BeautifulSoup import smtplib import time # https://www.amazon.it/Corsair-Vengeance-Mem
列表中删除元素时遇到问题。发送电子邮件时,我想从url[]
和prices[]
中删除相关元素
例如,如果电子邮件有:像url
aiphonex
和price 500€
并且已经发送,我想重写url[]
和prices[]
中的元素,删除Iphone的url和500€
import requests
from bs4 import BeautifulSoup
import smtplib
import time
# https://www.amazon.it/Corsair-Vengeance-Memorie-Desktop-Prestazioni/dp/B0143UM4TC
# https://www.amazon.it/AMD-Ryzen-5-3600-Processori/dp/B07STGGQ18
# https://www.amazon.it/Apple-iPhone-Grigio-Siderale-Ricondizionato/dp/B07985C44N
urls = []
prices=[]
all_product = []
n = int(input("Inserisci il numero di prodotti: "))
#agginge il link da controllare
print("\nInserisci i link:")
for i in range(0, n):
link = str(input())
urls.append(link)
#aggiunge il realtivi prezzi ai link
print("\nInserisci i prezzi:")
for i in range(0, n):
money = int(input())
prices.append(money)
#headers per i diversi motori di ricerca
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0 Chrome/83.0.4103.97 Safari/537.36'}
def check_price():
for url, price in zip(urls, prices):
soup = BeautifulSoup(requests.get(url, headers=headers).content, 'lxml')
title = soup.find(id='productTitle').get_text(strip=True)
try:
products = soup.find(id='priceblock_ourprice').get_text()
fix_string = products.replace(",", ".")
converted_price = float(fix_string[0:5])
all_product.append(converted_price)
money_saved=converted_price-price
if (converted_price<=price):
#send email
remove_link=str(url)
remove_price=price
if(urls.index(remove_link)&prices.index(remove_price)):
urls.pop((urls.index(remove_link)))
prices.pop(prices.index(remove_price))
except AttributeError:
print ("Prezzo non trovato, controlla se il prodotto ha un prezzo esposto")
print(all_product)
导入请求
从bs4导入BeautifulSoup
导入smtplib
导入时间
# https://www.amazon.it/Corsair-Vengeance-Memorie-Desktop-Prestazioni/dp/B0143UM4TC
# https://www.amazon.it/AMD-Ryzen-5-3600-Processori/dp/B07STGGQ18
# https://www.amazon.it/Apple-iPhone-Grigio-Siderale-Ricondizionato/dp/B07985C44N
URL=[]
价格=[]
所有产品=[]
n=int(输入(“产品编号:”)
#连接控制器
打印(“\n电子邮件i链接:”)
对于范围(0,n)内的i:
link=str(输入())
url.append(链接)
#aggiunge il realtivi prezzi ai链接
打印(“\nSerisci i prezzi:”)
对于范围(0,n)内的i:
money=int(输入())
价格。追加(货币)
#每台ricerca diversi motori的收割台
headers={'User-Agent':'Mozilla/5.0(X11;Ubuntu;Linux x86_64;rv:77.0)Gecko/20100101 Firefox/77.0 Chrome/83.0.4103.97 Safari/537.36'}
def check_price():
对于url,zip中的价格(url,价格):
soup=BeautifulSoup(requests.get(url,headers=headers.content,'lxml'))
title=soup.find(id='productTitle')。获取文本(strip=True)
尝试:
products=soup.find(id='priceblock\u ourprice').get\u text()
修复字符串=产品。替换(“,”,“)
转换后的价格=浮动(固定字符串[0:5])
所有产品。追加(转换后的价格)
节省的钱=转换后的价格
if(在Python中,从列表中删除不是一个好主意,该列表在中用于…In…
中,因为当您删除元素时,其他元素也会被移动(所以下一个元素将代替删除的元素)但for
不知道它,它跳转到列表中的下一个元素,并跳过移动到已删除元素位置的元素
最好在循环之前创建空列表(keep\u url=[]
),在循环内部将要保留的元素追加到此列表中(keep\u url.append(url)
),在循环之后将此列表分配给旧变量(url=keep\u url
)。之后,您可以再次运行它,它将使用列表而不删除元素
这段代码显示了我对它的看法
顺便说一句:因为使用input()
添加数据既长又复杂,所以我添加了从文件中读取数据的代码
import requests
from bs4 import BeautifulSoup
import smtplib
import time
# --- functions ---
def ask_for_data():
urls = []
prices = []
n = int(input("Inserisci il numero di prodotti: "))
#agginge il link da controllare
print("\nInserisci i link:")
for i in range(n):
link = input()
urls.append(link)
#aggiunge il realtivi prezzi ai link
print("\nInserisci i prezzi:")
for i in range(n):
money = input()
prices.append(money)
return urls, prices
def read_data():
with open('urls.txt') as fh:
text = fh.read()
urls = text.split('\n')
with open('prices.txt') as fh:
text = fh.read()
prices = text.split('\n')
return urls, prices
def write_data(urls, prices):
with open('urls.txt', 'w') as fh:
text = "\n".join(urls)
fh.write(text)
with open('prices.txt', 'w') as fh:
text = "\n".join(prices)
fh.write(text)
def send_email(url, price, converted_price):
#money_saved = converted_price-price
print('TODO: send mail with', url, price, converted_price)
# --- main ---
# - start -
#urls, prices = ask_for_data()
urls, prices = read_data()
#headers per i diversi motori di ricerca
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0 Chrome/83.0.4103.97 Safari/537.36'
}
while True:
# - before loop -
keep_urls = []
keep_prices = []
all_products = []
# - loop -
for url, price in zip(urls, prices):
r = requests.get(url, headers=headers)
#print(r.status_code)
soup = BeautifulSoup(r.content, 'lxml')
title = soup.find(id='productTitle').get_text(strip=True)
try:
products = soup.find(id='priceblock_ourprice').get_text()
fix_string = products.replace(",", ".")
converted_price = float(fix_string[0:5])
all_products.append(converted_price)
if converted_price <= price:
send_email(url, price, converted_price)
else:
keep_urls.append(url)
keep_prices.append(price)
except AttributeError as ex:
print('Ex:', ex)
print("Prezzo non trovato, controlla se il prodotto ha un prezzo esposto")
# - loop -
urls = keep_urls
prices = keep_prices
print(all_products)
time_sleep(60)
# - end -
write_data(urls, prices)
导入请求
从bs4导入BeautifulSoup
导入smtplib
导入时间
#---功能---
def ask_获取_数据():
URL=[]
价格=[]
n=int(输入(“产品编号:”)
#连接控制器
打印(“\n电子邮件i链接:”)
对于范围(n)中的i:
链接=输入()
url.append(链接)
#aggiunge il realtivi prezzi ai链接
打印(“\nSerisci i prezzi:”)
对于范围(n)中的i:
金钱=投入
价格。追加(货币)
返回网址、价格
def read_data():
将open('url.txt')作为fh:
text=fh.read()
URL=text.split(“\n”)
以open('prices.txt')作为fh:
text=fh.read()
prices=text.split(“\n”)
返回网址、价格
def写入数据(URL、价格):
将open('url.txt','w')作为fh:
text=“\n”。加入(URL)
fh.写入(文本)
打开('prices.txt','w')作为fh:
text=“\n”。加入(价格)
fh.写入(文本)
def发送电子邮件(url、价格、转换价格):
#节省的钱=转换后的价格
打印('TODO:使用'、url、价格、转换后的价格发送邮件)
#---梅因---
#-开始-
#URL,prices=ask_for_data()
URL,价格=读取数据()
#每台ricerca diversi motori的收割台
标题={
“用户代理”:“Mozilla/5.0(X11;Ubuntu;Linux x86_64;rv:77.0)Gecko/20100101 Firefox/77.0 Chrome/83.0.4103.97 Safari/537.36”
}
尽管如此:
#-循环前-
保持URL=[]
保持价格=[]
所有产品=[]
#-回路-
对于url,zip中的价格(url,价格):
r=requests.get(url,headers=headers)
#打印(r.状态\ U代码)
汤=BeautifulSoup(r.含量,'lxml')
title=soup.find(id='productTitle')。获取文本(strip=True)
尝试:
products=soup.find(id='priceblock\u ourprice').get\u text()
修复字符串=产品。替换(“,”,“)
转换后的价格=浮动(固定字符串[0:5])
所有产品。追加(换算价格)
如果你在这段代码中的什么地方尝试这样做,你有什么特别的“麻烦”吗?我试图在if条件下使用pop(),但它会出现这样的错误:“str”对象不能解释为整数你的意思是url.pop(url)
noturl.pop[url]
是的,@alaniwi。我现在编辑了postPython不想从列表中删除的内容,该列表在for
中使用。我们通常在for
循环(keep\u url=[]
)之前创建空列表,并在for
循环中为该列表添加保留元素keep\u url.append(url)
,循环之后,我们将新列表分配给旧变量url=keep_url
。最终,我们复制了在中用于-的列表,用于url、zip中的价格(urls.copy()、prices.copy()):
其余的都是相同的urls.pop(…)
prices.pop(…)
.BTW而不是urls.pop(urls.index(url))
您可以使用ulrs.remove(url)