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.

Xpath recopila enlaces desde y hacia

Hay un código HTML, algo como esto

<strong>Link group name 1</strong>
<br>
<a>Link_1</a>
<a>Link_2</a>
<a>Link_3</a>
<br>
<strong>Link group name 2</strong>
<a>Link_1</a>
<a>Link_2</a>
<br>
<br>
<strong>Link group nameк 3</strong>
<a>Link_1</a>

Necesito imprimir estos datos en esta forma:

Link group name 1 - Link_1
Link group name 1 - Link_2
Link group name 1 - Link_3

Link group name 2 - Link_1
Link group name 2 - Link_2

Link group name 3 - Link_1

¿Es posible implementar esto usando XPath o cómo capturar, por ejemplo, todos los enlaces entre ciertos <strong>, o capturar todos los enlaces hasta el primer <strong> que aparezca?

Estoy intentando hacer esto, pero no funciona y probablemente recolectará todo después de <strong>

for model in item.css('strong'):
    print(model.css('::text').get(), model.xpath('following-sibling::a[1]/@href').extract())

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible implementar esto utilizando xpath.

    Para capturar todos los enlaces entre ciertas etiquetas <strong>, puedes usar la siguiente expresión xpath:

    //strong[text()='Nombre del grupo de enlaces 1']/following-sibling::a/text()
    

    Esta expresión selecciona todos los elementos <a> que siguen al elemento <strong> con el texto “Nombre del grupo de enlaces 1” y devuelve su contenido de texto.

    Para capturar todos los enlaces hasta la primera etiqueta <strong> que encuentres, puedes usar la siguiente expresión xpath:

    //a[preceding-sibling::strong][1]/text()
    

    Esta expresión selecciona el primer elemento <a> que tiene un elemento <strong> hermano precedente y devuelve su contenido de texto. Esto captura efectivamente todos los enlaces hasta la primera etiqueta <strong> que encuentres.

    Para imprimir los datos en la forma requerida, puedes iterar sobre los elementos <strong> y, para cada elemento, imprimir el contenido de texto del elemento junto con el contenido de texto de sus elementos <a> siguientes.

    Aquí hay un ejemplo de implementación utilizando xpath:

    from lxml import html
    
    # código HTML de ejemplo
    codigo_html = '''
    <strong>Nombre del grupo de enlaces 1</strong>
    <br>
    <a>Enlace_1</a>
    <a>Enlace_2</a>
    <a>Enlace_3</a>
    <br>
    <strong>Nombre del grupo de enlaces 2</strong>
    <a>Enlace_1</a>
    <a>Enlace_2</a>
    <br>
    <br>
    <strong>Nombre del grupo de enlaces 3</strong>
    <a>Enlace_1</a>
    '''
    
    # analizar el código HTML
    arbol = html.fromstring(codigo_html)
    
    # iterar sobre los elementos strong
    for elemento_strong in arbol.xpath('//strong'):
        # imprimir el contenido de texto del elemento strong
        print(elemento_strong.text_content())
    
        # iterar sobre los elementos a siguientes
        for elemento_a in elemento_strong.xpath('following-sibling::a'):
            # imprimir el nombre del grupo de enlaces y el texto del enlace
            print(f'{elemento_strong.text_content()} - {elemento_a.text_content()}')
    
        # imprimir una línea en blanco para separar los grupos de enlaces
        print()
    

    Esto devolverá:

    “`
    Nombre del grupo de enlaces 1
    Nombre del grupo de enlaces 1 – Enlace_1
    Nombre del grupo de enlaces 1 – Enlace_2
    Nombre del grupo de enlaces 1 – Enlace_3

    Nombre del grupo de enlaces 2
    Nombre del grupo de enlaces 2 – Enlace_1
    Nombre del grupo de enlaces 2 – Enlace_2

    Nombre del grupo de enlaces 3
    Nombre del grupo de enlaces 3 – Enlace_1
    “`

Comments are closed.