He utilizado pyparsing para varios proyectos de raspado de páginas HTML. Es una especie de término medio entre BeautifulSoup y los analizadores de HTML completos en un extremo, y el enfoque de bajo nivel de las expresiones regulares (de ese modo yace la locura).
Con pyparsing, a menudo puede obtener buenos resultados de análisis HTML identificando el subconjunto específico de la página o los datos que está tratando de extraer. Este enfoque evita los problemas de intentar analizar todo en la página, ya que algunos HTML problemáticos fuera de su región de interés podrían arrojar un analizador HTML exhaustivo.
Si bien esto suena como un enfoque regex glorificado, pyparsing ofrece instrucciones integradas para trabajar con texto etiquetado HTML o XML. Pyparsing evita muchos de los problemas que frustran las soluciones basadas en expresiones regulares:
- acepta espacios en blanco sin tirar basura '\ S *' por toda su expresión
- maneja atributos inesperados dentro de las etiquetas
- manijas atributos en cualquier orden
- maneja mayúsculas/minúsculas en las etiquetas
- asas atribuyen nombres con espacios de nombres
- mangos los valores de atributos entre comillas dobles, comillas simples o sin cotizaciones
- maneja etiquetas vacías (las de la forma
<blah />
)
- vuelve analizados datos de la etiqueta con el acceso a objetos-atributo para atributos de etiqueta
Aquí está un ejemplo sencillo de la pyparsing wiki que se <a href=xxx>
etiquetas de una página web:
from pyparsing import makeHTMLTags, SkipTo
# read HTML from a web page
page = urllib.urlopen("http://www.yahoo.com")
htmlText = page.read()
page.close()
# define pyparsing expression to search for within HTML
anchorStart,anchorEnd = makeHTMLTags("a")
anchor = anchorStart + SkipTo(anchorEnd).setResultsName("body") + anchorEnd
for tokens,start,end in anchor.scanString(htmlText):
print tokens.body,'->',tokens.href
Esto sacar los <a>
etiquetas, incluso si hay otras partes de la página que contiene HTML problemática.Hay otros ejemplos HTML en el pyparsing wiki:
Pyparsing no es una solución total a toda prueba de este problema, pero por la exposición de la proceso de análisis sintáctico para usted, puede controlar mejor las partes del HTML que le interesan específicamente, procesarlas y omitir el descanso.
Tiene que darnos ejemplos de páginas en las que falla su enfoque actual. De lo contrario, ¿cómo sabremos si nuestras soluciones propuestas resolverán sus problemas? Además, no olvide informar los errores html5lib en http://code.google.com/p/html5lib/issues/entry –