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
a
iphonex
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)
not
url.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)