Estoy tratando de extraer algunas líneas de un archivo fuente HTML. El siguiente está simplificado pero es la misma idea. Usando el ejemplo a continuación, estoy tratando de que salga en orden numérico ... es decir, Formulario 1, Formulario 2, Formulario 3, Formulario 4. El problema es que el segundo ciclo se reinicia en la segunda ronda. Entonces obtengo: Formulario 1, Formulario 2, Formulario 3, Formulario 2. ¿Cómo puedo editar para que el segundo ciclo continúe extrayendo el texto del Formulario 4?

Código

import re

line = 'bla bla bla<form>Form 1</form> some text...<form1>Form 
2</form1> more text?bla bla bla<form>Form 3</form> some text...
<form1>Form 4</form1> more text?'

for match in re.finditer('<form>(.*?)</form>', line, re.S):
  print match.group(1)
  for match1 in re.finditer('<form1>(.*?)</form1>', line, re.S):
    print match1.group(1)
    break
0
Jane 1 mar. 2018 a las 06:30

3 respuestas

La mejor respuesta
for match in re.finditer('<form1?>(.*?)</form1?>', line, re.S):
    print(match.group(1))

Modifico el código:

for match in re.finditer('(<form>(.*?)</form>)|(<form1>(.*?)</form1>)', line, re.S):
    if None != match.group(4):
        print(match.group(4))
    else:
        print(match.group(2))
0
William Feirie 1 mar. 2018 a las 04:14

¿Es esto lo que quieres?

>>> for item in re.finditer(r'<form[12]?>([^<]+)',line):
...     item.groups()[0]
...     
'Form 1'
'Form 2'
'Form 3'
'Form 4'

Si es así, simplemente no le digas a nadie que fue mi idea usar expresiones regulares para HTML.

0
Bill Bell 1 mar. 2018 a las 04:40

El objeto devuelto match tiene un método start que toma el índice del grupo deseado y devuelve el índice inicial del grupo coincidente en la cadena (es decir, line). Y luego puede dejar que el ciclo interno comience en ese índice en lugar del comienzo de line cortando line (por ejemplo, line[some_index:]). Una forma más adecuada y sencilla es dejar que su re.finditer interior tome match.group(1) en lugar de line.

Sin embargo, generalmente no es una buena idea manejar HTML manualmente a menos que el patrón de HTML dirigido sea lo suficientemente simple. Puede usar una biblioteca sofisticada y fácil de usar para analizar y extraer datos de HTML.

0
Dummmy 1 mar. 2018 a las 03:58