Siempre es mejor, si es posible, no redescubrir la rueda. Existen algunas buenas herramientas que, o bien convertir HTML a XML bien formado, o actuar como un XmlReader:
Aquí hay tres buenas herramientas:
TagSoup, un programa de código abierto, es un Java y SAX - herramienta basada en, desarrollada por John Cowan. Esto es un analizador compatible con SAX escrito en Java que, en lugar de analizar XML bien formado o válido, analiza HTML como se lo encuentra en estado salvaje: pobre, desagradable y brutal, aunque a menudo lejos de ser corto. TagSoup está diseñado para personas que tienen que procesar este material utilizando una apariencia de diseño de aplicación racional. Al proporcionar una interfaz SAX, permite que las herramientas XML estándar se apliquen incluso al peor HTML. TagSoup también incluye un procesador de línea de comandos que lee archivos HTML y puede generar HTML limpio o XML bien formado que es una aproximación cercana a XHTML.
Taggle es un puerto comercial C++ de TagSoup.
SgmlReader es una herramienta desarrollada por Microsoft Chris Lovett.
SgmlReader es una API de XmlReader sobre cualquier documento SGML (incluido el soporte integrado para HTML). También se proporciona una utilidad de línea de comandos que genera el resultado XML bien formado.
Descargar el archivo zip que incluye el ejecutable independiente y el código fuente completo: SgmlReader.zip
un logro excepcional se the pure XSLT 2.0 Parser of HTML escrito por David Carlisle.
Leer su código sería un gran ejercicio de aprendizaje para todos nosotros.
partir de la descripción:
"d: htmlparse (cadena)
d: htmlparse (cadena, espacio de nombres, html-mode)
La única forma de argumento es equivalente a)
d: htmlparse (cadena, 'http://ww.w3.org/1999/xhtml', true()))
Divide la cadena como HTML y/o XML usando algunas heurísticas incorporadas a)
control implica apertura y cierre de elementos.
No tiene pleno conocimiento de HTML DTD pero sí que tiene la lista completa de
elementos vacíos y la lista completa de definiciones de entidades. Se aceptan entidades HTML y
referencias de caracteres hexadecimales y hexadecimales. Nota html-entities
se reconocen incluso si html-mode = false().
nombres Element serán minúsculas (si html-modo es cierto()) y se colocan en el espacio de nombres
especificado por el parámetro de espacio de nombres (que puede ser "" para denotar
no-espacio de nombres a menos que el entrada ha eXPLICT declaraciones de espacios de nombres, en
cuyo caso éstos serán honrados.
nombres de los atributos serán minúsculas si html-mode = true() "
Lea una descripción más detallada here.
Espero que esto haya ayudado.
Saludos,
Dimitre Novatchev.
Buena respuesta - expresiones regulares es su amigo! –
Mala respuesta. No hagas esto – SLaks
-1 Hmmm, usando Regex para analizar HTML. ¿Qué podría salir mal? Oh, eso es correcto: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Ash