Scrapy: encontrar cadenas de caracteres de una lista previamente definida en un documento HTML.
Quiero usar scrapy para tomar las cadenas de texto de una lista predefinida ‘bacteria_species’ y compararlas cadena por cadena con los elementos de un documento HTML del sitio web ‘http://www.microbiologyresearch.org/content/journal/ijsem’; y si esta cadena se encuentra en un elemento-etiqueta del HTML, se debe devolver el texto de todo el elemento.
Aquí está mi código:
import scrapy
class BacteriaSpider(scrapy.Spider):
name = 'bacteria'
allowed_domains = ['https://www.microbiologyresearch.org/content/journal/ijsem']
start_urls = ['http://www.microbiologyresearch.org/content/journal/ijsem/']
def parse(self, response):
bacteria_species = ['Abditibacterium utsteinense',
'Abiotrophia defectiva',
'Abyssibacter profundi',
'Abyssicoccus albus',
'Abyssivirga alkaniphila',
'Acanthopleuribacter pedis',
'Acaricomes phytoseiuli',
'Acetanaerobacterium elongatum',
'Acetanaerobacterium sp.',
'Acetatifactor muris']
for bacteria in bacteria_species:
response.xpath("//*/text()[contains(., bacteria)]").getall() # select the text of all nodes
pass
Desafortunadamente, no funciona.
¿Alguien tiene una mejor idea?
davy.ai
Hay un par de problemas con el código que podrían estar impidiendo que funcione correctamente.
En primer lugar, al utilizar
.xpath()
para buscar una cadena dentro de un documento HTML, es necesario utilizar la funcióntext()
dentro de los corchetes para especificar que se está buscando dentro del texto del elemento.En segundo lugar, la variable
bacteria
no se está interpolando correctamente dentro de la función.xpath()
. Para solucionar esto, se pueden usar las f-strings o el método.format()
para insertar la variable en la cadena.Por último, una vez encontrados los elementos que contienen la cadena deseada, es necesario extraer su contenido de texto completo. Para hacer esto, se puede utilizar el método
.extract()
o.getall()
en los elementos seleccionados.Aquí hay una versión actualizada del código que debería funcionar:
En esta versión actualizada, usamos las f-strings para interpolar la variable
bacteria
dentro de la función.xpath()
. Luego, recopilamos todos los elementos coincidentes usando.getall()
, y extraemos su contenido de texto completo utilizando otra llamada a.xpath()
con el selectordescendant-or-self::text()
. Luego, generamos un diccionario con información sobre los elementos coincidentes y el texto para cada especie de bacteria.