es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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ón text() 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:

    import scrapy
    
    class BacteriaSpider(scrapy.Spider):
        name = 'bacteria'
        allowed_domains = ['microbiologyresearch.org']
        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:
                selector = response.xpath(f"//*[contains(text(), '{bacteria}')]")
                matching_elements = selector.getall()
                matching_text = "".join(selector.xpath("descendant-or-self::text()").getall()).strip()
                yield {
                    'bacteria': bacteria,
                    'matching_elements': matching_elements,
                    'matching_text': matching_text
                }
    

    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 selector descendant-or-self::text(). Luego, generamos un diccionario con información sobre los elementos coincidentes y el texto para cada especie de bacteria.

Comments are closed.