Python - Cómo buscar un texto en un archivo CSV

 
Vista:
Imágen de perfil de Jey
Val: 35
Ha disminuido su posición en 4 puestos en Python (en relación al último mes)
Gráfica de Python

Cómo buscar un texto en un archivo CSV

Publicado por Jey (15 intervenciones) el 05/09/2019 23:40:59
Hola, estoy intentando crear un pequeño código capaz de publicar noticias en una web.

Para ello necesito que acceda a un archivo CSV, lea la última linea, y después compare esa última línea con el resto del CSV para asegurarse de que esa última noticia no está duplicada y así poder pasar a la publicación.

Vayamos con la parte que no consigo: verificar si la noticia está ya creada o no.

Aquí os dejo lo que tengo de código, fijaros sobre todo en la parte final del código, la parte del scrapping funciona bien, muchísimas gracias:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from scrapy.item import Field
from scrapy.item import Item
from scrapy.spiders import Spider
from scrapy.selector import Selector
from scrapy.loader import ItemLoader
import time
import csv
import pandas as pd
import numpy as np
 
 
class Pregunta(Item):
    pregunta = Field()
    id = Field()
 
 
 
 
 
 
class Vandal(Spider):
    name = "ColectorVandal"
    start_urls = ['https://vandal.elespanol.com/noticias/videojuegos']
 
    def parse(self, response):
        sel = Selector(response)
        preguntas = sel.xpath('//*[@id="pestana_noticias"]/div[2]/div[1]/div/div[2]/div[1]/a') 


        for i, elem in enumerate(preguntas):
                    
            item = ItemLoader(Pregunta(), elem)
            item.add_xpath('pregunta', '//*[@id="pestana_noticias"]/div[2]/div[1]/div/div[2]/div[1]/a/text()')
            
            
            
            
            item.add_value('id', i)
            yield item.load_item()




#TODA LA PARTE DE ARRIBA FUNCIONA PERFECTAMENTE, ES A PARTIR DE AHORA DÓNDE TENGO DUDAS:




with open('vandalnoticia.csv', 'r') as f:   #Abro el CSV

    lines = f.read().splitlines()           #En estas dos líneas creo la variable "last_new", y sólo almacena la última linea del CSV
    last_new = lines[-1]
    
    print(last_new)                         #La imprimo, sólo para verificar que funciona, y hasta aquí, funciona.



    #Ahora llega la parte que no funciona, aquí trato de comprobar si "last_new" existe en el archivo CSV.


    if f.str.contains(last_new):
        print("Me cago en dios")    #Esto es fruto de mi desesperación xD
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jey
Val: 35
Ha disminuido su posición en 4 puestos en Python (en relación al último mes)
Gráfica de Python

Cómo buscar un texto en un archivo CSV

Publicado por Jey (15 intervenciones) el 09/09/2019 22:44:30
¿Alguien puede ayudarme? Daré más datos:

Necesito comprobar si la variable "last_new", que contiene la última línea del CSV, ya existe o no en ese mismo CSV.

Estoy intentándolo de varias formas pero no lo consigo, dejo algún ejemplo:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with open('vandalnoticia.csv', 'r', encoding='utf-8') as f:   #Abro el CSV
 
    lines = f.read().splitlines()           #En estas dos líneas creo la variable "last_new", y sólo almacena la última linea del CSV
    last_new = lines[-1]
 
 
 
 
    print(last_new)                         #La imprimo, sólo para verificar que funciona, y hasta aquí, funciona.
 
 
    if last_new in open('vandalnoticia.csv').read():
        print("True")
    else:
        print("False")



Aquí otro intento:




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with open('vandalnoticia.csv', 'r', encoding='utf-8') as f:   #Abro el CSV
 
    lines = f.read().splitlines()           #En estas dos líneas creo la variable "last_new", y sólo almacena la última linea del CSV
    last_new = lines[-1]
 
 
 
 
    print(last_new)                         #La imprimo, sólo para verificar que funciona, y hasta aquí, funciona.
 
 
 
    for row in f:
        if last_new in row[1]:
            print("Noticia repetida")
        else:
            print("No hay noticias repetidas")
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.475
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Cómo buscar un texto en un archivo CSV

Publicado por joel (901 intervenciones) el 10/09/2019 08:28:12
Hola Jey, yo lo he probado con un archivo de texto y me ha funcionado esto:
1
2
3
4
5
6
7
8
9
10
11
with open('vandalnoticia.csv', 'r', encoding='utf-8') as f:   #Abro el CSV
 
    lines = f.read().splitlines()           #En estas dos líneas creo la variable "last_new", y sólo almacena la última linea del CSV
    last_new = lines[-1]
 
    print(last_new)                        #La imprimo, sólo para verificar que funciona, y hasta aquí, funciona.
 
    if last_new in lines:
        print("True")
    else:
        print("False")
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jey
Val: 35
Ha disminuido su posición en 4 puestos en Python (en relación al último mes)
Gráfica de Python

Cómo buscar un texto en un archivo CSV

Publicado por Jey (15 intervenciones) el 10/09/2019 15:01:27
Funciona, ahora el problema está en que siempre me detecta la noticia como repetida. Scrapy añade la noticia directamente al CSV y después verifico si está repetida.

Lo que creo que ocurre es que siempre la detecta porque no busca si está repetida, está buscando si existe dentro del CSV, y claro que existe, la última línea existe dentro del CSV.

¿Me estoy explicando? Ha sonado muy laberíntico xD .

Pues eso, ¿Existe alguna manera de verificar si está repetida?

Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Cómo buscar un texto en un archivo CSV

Publicado por tincopasan (1082 intervenciones) el 10/09/2019 16:12:05
1)podrías mostrar unas líneas de la estrucutura del archivo csv
2)no entiendo porque no usas pandas si lo tenés declarado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
Imágen de perfil de Jey
Val: 35
Ha disminuido su posición en 4 puestos en Python (en relación al último mes)
Gráfica de Python

Cómo buscar un texto en un archivo CSV

Publicado por Jey (15 intervenciones) el 10/09/2019 18:48:23
Parece que la lógica que estaba siguiendo en mi programa estaba mal, de nada me sirve comprobar si la última línea ya existe en el CSV, lo que debo comprobar es si la noticia de la página (obtenida a través de Scrapy) existe en el CSV, en caso de existir, deja de escribir, en caso de no existir, la escribe en el CSV, aquí dejo el código, aunque no consigo que funcione.

Lo que interpreto que debo hacer, es almacenar el contenido de esta ruta de XPATH en una variable, para compararla con el CSV, la ruta es esta(en el código también se ve) : '//*[@id="pestana_noticias"]/div[2]/div[1]/div/div[2]/div[1]/a/text()'


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from scrapy.item import Field
from scrapy.item import Item
from scrapy.spiders import Spider
from scrapy.selector import Selector
from scrapy.loader import ItemLoader
import time
import csv
import pandas as pd
import numpy as np
 
FEED_EXPORT_ENCODING = "utf-8"
 
 
 
class Pregunta(Item):
    pregunta = Field()
    id = Field()
 
 
 
class Vandal(Spider):
 
    custom_settings = {
        'FEED_EXPORT_ENCODING': 'utf-8',
    }
    name = "ColectorVandal"
    start_urls = ['https://vandal.elespanol.com/noticias/videojuegos']
 
    def parse(self, response):
 
        sel = Selector(response)
        preguntas = sel.xpath('//*[@id="pestana_noticias"]/div[2]/div[1]/div/div[2]/div[1]/a')


        for i, elem in enumerate(preguntas):
            
            

            with open('vandalnoticia.csv', 'r', encoding='utf-8') as f:   #Abro el CSV
                
                lines = f.read().splitlines()           #En estas dos líneas creo la variable "last_new", y sólo almacena la última linea del CSV
                last_new = lines[-1]


                item = ItemLoader(Pregunta(), elem)
                item.add_xpath('pregunta','//*[@id="pestana_noticias"]/div[2]/div[1]/div/div[2]/div[1]/a/text()')


                if last_new in lines:                   #Aquí compruebo si la última noticia existe en el CSV, pero no sirve, debo cambiar "lines" por una variable que tenga la noticia almacenada
                    print("Noticia repetida")
                else:
                    item.add_value('id', i)
                    yield item.load_item()

Para que funcione hay que ejecutar esto en la línea de comandos :

scrapy runspider scrapping.py -o vandalnoticia.csv -t csv


Es posible que haya cosas sin sentido en el código, como un bucle for que no tendría por qué estar, todo esto es porque estoy probando cosas sin parar. Un saludo y muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar