¿Se permite “>” (U+003E SIGNO MAYOR QUE) dentro de un valor de atributo de elemento html?

StackOverflow https://stackoverflow.com/questions/94528

  •  01-07-2019
  •  | 
  •  

Pregunta

En otras palabras, ¿se puede utilizar /<tag[^>]*>.*?<\/tag>/ expresión regular para que coincida con el tag elemento html que no contiene anidado tag ¿elementos?

Por ejemplo (lt.html):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>greater than sign in attribute value</title>
  </head>
  <body>
    <div>1</div>
    <div title=">">2</div>
  </body>
</html>

expresión regular:

$ perl -nE"say $1 if m~<div[^>]*>(.*?)</div>~" lt.html

Y raspador de pantalla:

#!/usr/bin/env python
import sys
import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(sys.stdin)
for div in soup.findAll('div'):
    print div.string


$ python lt.py <lt.html

Ambos dan el mismo resultado:

1
">2

Rendimiento esperado:

1
2

w3c dice:

Los valores de los atributos son una mezcla de referencias de texto y caracteres, excepto con la restricción adicional de que el texto no puede contener un ampers y ampers y.

¿Fue útil?

Solución

Sí, está permitido (el Validador W3C lo acepta, sólo emite un aviso).

sin escapar < y > También se permiten comentarios internos, por lo que se pueden engañar expresiones regulares tan simples.

Si BeautifulSoup no maneja esto, podría ser un error o quizás una decisión de diseño consciente para hacerlo más resistente a la falta de comillas de cierre en los atributos.

Otros consejos

Creo que eso es válido, y el validador del W3C está de acuerdo, pero la fuente autorizada para esta información es el estándar ISO 8879:1986, que cuesta ~150EUR/210USD.De todos modos, no está mal codificarlos, así que en caso de duda, codifique.Además, si utiliza un tipo de documento basado en XML, deberá codificar signos mayores que en la secuencia. ]]>.

Literal > es legal en todo el contenido html, tanto dentro de los valores de los atributos como como texto dentro de un elemento.

Después de leer lo siguiente:

http://www.w3.org/International/questions/qa-escapes

parece que se sugieren escapes de entidades en todas partes (incluso en los atributos) para < > y &

Si insiste en usar expresiones regulares (que son apropiadas para operaciones básicas con cadenas), intente usar <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>.Debe coincidir perfectamente con los atributos y, por lo tanto, permitirle acceder al contenido interno (aunque debe colocarlo en un grupo de captura).

También puede utilizar el Paquete de agilidad HTML para analizar HTML, lo cual recomendaría si va a realizar muchos análisis.Mantener expresiones regulares grandes puede convertirse fácilmente en un dolor de cabeza, pero mientras tanto también son mucho más efectivos si puedes hacerlo.

yeah except /<tag[^>]*>.*?<\/tag>/

No coincidirá con una sola etiqueta, pero coincidirá con la primera etiqueta inicial y la última etiqueta final para una etiqueta determinada.Al igual que tu primera coincidencia de etiquetas no codiciosa, tu intermedio también debe escribirse como no codicioso.

mira si obtienes el mismo resultado usando >en lugar de >

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top