Estoy acostumbrado a Beautifulsoup donde extraería elementos y luego buscaría dentro de ellos. Pero LXML no se comporta de esa manera y parece que está buscando desde el documento principal.

En el siguiente ejemplo, el resultado que obtengo es:

Caso 1

  • Criterios: 1
  • Criterios: 2
  • Criterios: 3
  • Criterios: 4

Caja: 2

  • Criterios: 1
  • Criterios: 2
  • Criterios: 3
  • Criterios: 4

Pero lo que esperaba era:

Caso 1

  • Criterios: 1
  • Criterios: 2

Caja: 2

  • Criterios: 3
  • Criterios: 4

Código de ejemplo:

from lxml.html import fromstring, tostring

html = """
<p>Test document</p>
<case id='1'>
  <criteria id='1'><p>Some text</p></criteria>
  <criteria id='2'><p>Some more text</p></criteria>
</case>
<case id='2'>
  <criteria id='3'><p>It just keeps going</p></criteria>
  <criteria id='4'><p>Will it never end?</p></criteria>
</case>
"""

doc = fromstring(html)
case_list = doc.xpath('//case')
for case in case_list:
    print('Case: ', case.get('id'))
    criteria_list = case.xpath('//criteria')
    for criteria in criteria_list:
        print(' - Criteria: ', criteria.get('id'))
1
alj 27 ago. 2020 a las 10:57

1 respuesta

La mejor respuesta

El problema probablemente esté en esta línea:

criteria_list = case.xpath('//criteria')

Intente reemplazar la expresión XPath de '// criterios' (que busca el documento desde la raíz) a './criteria' (que busca desde el elemento actual):

criteria_list = case.xpath('./criteria')
2
Alexandra Dudkina 27 ago. 2020 a las 11:53