elemento web de Python para enviar texto y usar el archivo abierto txt

Resuelto Ömer FNz asked hace 10 meses • 2 respuestas

Quiero convertir el elemento de un elemento web a una cadena y enviarlo a otra función y usarlo en el nombre del archivo. Probé muchos métodos pero fallé. Estoy buscando ideas sobre cómo hacerlo. debajo de mis códigos.

product_title = None

def product_title():
    global product_title
    product_title = driver.find_element(By.CSS_SELECTOR, "#GoodsBlock > table > tbody > tr:nth-child(1) > td.product-title > div > a")
    print(product_title.text)
    product_title.click()


def write_txt():
    file = open("games_files/"+product_title+".txt", "w")

product_title()
write_txt()

y error

Traceback (most recent call last):
  File "D:\python\xbox\pythonProject\scrap_games.py", line 48, in <module>
    write_txt()
  File "D:\python\xbox\pythonProject\scrap_games.py", line 41, in write_txt
    file = open("games_files/"+product_title.text+".txt", "w")
                               ^^^^^^^^^^^^^^^^^^

Probé muchos métodos pero fallé. Estoy buscando ideas sobre cómo hacerlo.

Ömer FNz avatar Feb 16 '24 22:02 Ömer FNz
Aceptado

No he usado mucho Selenium, pero esto debería solucionar el problema. En lugar de usar global y +cadenas, cambiar a return y f-string ayuda a mover la información entre definiciones. Este es el problema principal ya que su código no configura la product_titlevariable.

Intentar:

def get_product_title():
    product_title = driver.find_element(By.CSS_SELECTOR, "#GoodsBlock > table > tbody > tr:nth-child(1) > td.product-title > div > a")    
    print(product_title.text)
    product_title.click()
    return product_title.text


def write_txt():
    file = open(f"games_files/{product_title}.txt", "w")

product_title = get_product_title()
write_txt()

Cambié el nombre de la definición para que sea más claro y pueda ayudar a desglosar mi respuesta. product_titleobtiene el valor devuelto de product_title.textfrom get_product_title, de su comentario esto contiene el valor que desea. Esto evita tener que preocuparse por globalentrar en su defensa.

write_txtahora tiene una cadena f que inserta la variable product_titlesin la necesidad de +'s.

EDITAR: versión de eliminación de emoji

Basado en respuestas de aquí: https://stackoverflow.com/a/50602709/22669764

EDITAR #2: Envolvió el product_title.textin stry lo convirtió en una variable en caso de que product_title.click()haga algo con el valor. Se agregó lstripy, rstripcon suerte, para mitigar las cosas que matan a los emoji.

Instalar paquete emoji conpip install emoji

import emoji

def get_product_title():
    product_title = driver.find_element(By.CSS_SELECTOR, "#GoodsBlock > table > tbody > tr:nth-child(1) > td.product-title > div > a")
    title = str(product_title.text)
    print(title)
    product_title.click()
    return title
    
def give_emoji_free_text(text):
    return str(emoji.replace_emoji(text, replace='')).lstrip().rstrip()

def write_txt():
    file = open(f"games_files/{clean_title}.txt", "w")

product_title = get_product_title()
clean_title = give_emoji_free_text(product_title)
write_txt()

Espero que te sirva. Si es así, vota y márcalo como respondido.

NebularNerd avatar Feb 16 '2024 16:02 NebularNerd