Recuperando cadena de html en una tabla no única

Aquí está el html que estoy tratando de analizar.

<TD>Serial Number</TD><TD>AB12345678</TD>

Estoy intentando usar expresiones regulares para analizar los datos. Escuché sobre BeautifulSoup, pero hay alrededor de 50 elementos como este en la página, todos usando los mismos parámetros de tabla y ninguno de ellos tiene números de identificación. Lo más cercano que tienen a los identificadores únicos son los datos en la celda antes de los datos que necesito.

serialNumber = re.search("Serial Number</td><td>\n(.*?)</td>", source)

La fuente es simplemente el código fuente de la página capturada usando urllib. Hay una nueva línea en el html entre el segundo y el número de serie, pero no estoy seguro de si eso importa.

preguntado el 16 de mayo de 11 a las 19:05

Regex es tradicionalmente una solución desaconsejada para analizar HTML. Realmente debería usar BeautifulSoup, descendiendo a la tabla y obteniendo datos si y solo si (condición). De lo contrario, pase a la siguiente mesa. Tu podrías intentar scrapy y utilícelo para escribir una araña, que normalmente incorpora algo similar a una expresión regular:

2 Respuestas

Pyparsing puede brindarle un extractor un poco más robusto para sus datos:

from pyparsing import makeHTMLTags, Word, alphanums

htmlfrag = """<blah></blah><TD>Serial Number</TD><TD>
            AB12345678
            </TD><stuff></stuff>"""

td,tdEnd = makeHTMLTags("td")

sernoFormat = (td + "Serial Number" + tdEnd + 
                td + Word(alphanums)('serialNumber') + tdEnd)


for sernoData in sernoFormat.searchString(htmlfrag):
    print sernoData.serialNumber

Huellas dactilares:

AB12345678

Tenga en cuenta que a pyparsing no le importa dónde cae el espacio en blanco adicional, y también maneja atributos inesperados que pueden aparecer en las etiquetas definidas, espacios en blanco dentro de las etiquetas, etiquetas en mayúsculas / minúsculas, etc.

contestado el 17 de mayo de 11 a las 07:05

+1 por dar un ejemplo sobre cómo usar un analizador y no solo el habitual "¡¡¡usa un analizador para html !!!" - stema

En la mayoría de los casos es mejor trabajar en html usando un analizador apropiado, pero en algunos casos está perfectamente bien usar expresiones regulares para el trabajo. No sé lo suficiente sobre su tarea para juzgar si es una buena solución o si es mejor ir con la solución de @Paul, pero aquí trato de arreglar su expresión regular:

serialNumber = re.search("Serial Number</td><td>(.*?)</td>", source, re.S | re.I )

Quité el \n, porque es difícil en mi opinión (\ n, \ r, \ r \ n, ...?), en su lugar usé la opción re.S (Dotall).

Pero tenga en cuenta, ahora si hay una nueva línea, ¡estará en su grupo de captura! es decir, debe eliminar los espacios en blanco de su resultado.

Otro problema de su expresión regular es el <TD> en tu cadena pero buscas <td>. Ahí está la opción re.I (Ignorar caso).

Puede encontrar más explicaciones sobre las expresiones regulares aquí en docs.python.org

contestado el 17 de mayo de 11 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.