2011-12-10 12 views
7

Soy nuevo en XPath. Estoy tratando de analizar una página usando XPath. Necesito obtener información de la etiqueta, pero el apóstrofo que se escapó en el título lo estropea todo.Etiqueta de análisis Python XPath con el apóstrofo

Para el análisis utilizo Grab.

etiqueta de la fuente:

<img src='somelink' border='0' alt='commission:Alfred\'s misadventures' title='commission:Alfred\'s misadventures'> 

XPath real:

g.xpath('.//tr/td/a[3]/img').get('title') 

devoluciones

commission:Alfred\\ 

¿Hay alguna manera de solucionar este problema?

Gracias

+4

Honestamente, debería estar contento de que '.xpath' devuelva algo. Este HTML no es lo suficientemente válido para que el módulo 'html' de LXML se ahogue en él. –

+2

Acabo de experimentar con lxml y BeautifulSoup, y ninguno de ellos lo analizó correctamente tampoco. Obviamente, las comillas externas para los valores de los atributos deben ser comillas dobles. ¿Cuál es la fuente del html? – ekhumoro

Respuesta

5

Basura, salida de basura. Su entrada no está bien formada, porque escapa de forma incorrecta del carácter de comillas simples. Muchos lenguajes de programación (incluyendo Python) usan la barra invertida para escapar de las comillas en los literales de las cadenas. XML no. Usted debe 1) rodear el valor del atributo con comillas dobles; o 2) use &apos; para incluir una comilla simple.

De the XML spec:

para permitir valores de atributos para contener tanto comillas simples y dobles, el apóstrofe o carácter comilla simple (') puede representarse como ' &apos;', y la doble cotización personaje (") como" &quot;".

+0

Gracias por la información, pero no es mi opinión. Estoy tratando de analizar una página con esa etiqueta, por lo que la única manera de solucionar esto es reemplazarla en fuente completa. Con mucho gusto, ya lo resolví (no exactamente, pero de todos modos ...) este problema con regex –

+1

XML rompe la ley de Postel, pero en la práctica a veces es necesario dar masajes a la entrada antes de enviarla a un analizador XML adecuado. Algunos puristas te criticarán por ello, pero yo no me sentiría tan mal al respecto. –

+0

XML ya permite DOS métodos para obtener un apóstrofo en un valor de atributo: (1) encierre el valor entre comillas en lugar del uso de apóstrofes (2). '''. Hagamos que sea compatible con Postel, y agregue dos métodos adicionales. (1) backslash-escaping (2) apostrophe-doubling, como en SQL. Tus tareas: actualizar la gramática, mejorar un analizador. Alternativa: se alegra de que XML haya evitado el caos de HTML donde los consumidores se desviven por aceptar HTML incorrecto. –

1

a medida que la prevista 'XML' no es un documento bien formada debido a apóstrofes anidados, sin expresión XPath se puede evaluar en él .

El no bien formado de texto correspondiente se puede corregir a:

<img src="somelink" 
border="0" 
alt="commission:Alfred's misadventures" 
title="commission:Alfred's misadventures"/> 

En caso de que haya un requiremend raro no usar comillas, a continuación, una conversión correcta es:

<img src='somelink' 
border='0' 
alt='commission:Alfred&apos;s misadventures' 
title='commission:Alfred&apos;s misadventures'/> 

Si se le proporciona la entrada incorrecta, en un lenguaje como C# uno puede intentar convertirlo a su contraparte correcta usando:

string correctXml = input.replace("\\'s", "&apos;s") 

Probablemente haya una manera similar de hacer lo mismo en Python.

Cuestiones relacionadas