“& Gt;” (U + 003E GREATER-THAN SIGN) est-il autorisé dans une valeur d'attribut d'élément html?

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

  •  01-07-2019
  •  | 
  •  

Question

En d'autres termes, peut-on utiliser / regex pour correspondre à la balise Elément HTML ne contenant pas d'éléments imbriqués?

Par exemple (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>

Regex:

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

Et le grattoir:

#!/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

Les deux donnent le même résultat:

1
">2

Résultat attendu:

1
2

w3c dit:

  

Les valeurs d'attributs sont un mélange de texte   et références de caractères, sauf avec   la restriction supplémentaire que le   le texte ne peut pas contenir d'ambiguïté   esperluette.

Était-ce utile?

La solution

Oui, c'est autorisé (le Validateur W3C l'accepte et ne diffuse qu'un avertissement).

Les < et > non échappés sont également autorisés dans les commentaires. Vous pouvez donc tromper une simple expression rationnelle.

Si BeautifulSoup ne gère pas cela, il peut s’agir d’un bogue ou d’une décision de conception délibérée visant à le rendre plus résistant aux citations de fermeture manquantes dans les attributs.

Autres conseils

Je pense que cela est valable, et le validateur W3C est d'accord, mais la source faisant autorité pour cette information est la norme ISO 8879: 1986, qui coûte ~ 150EUR / 210USD. Quoi qu'il en soit, il n'est pas mauvais de les encoder, donc en cas de doute, encodez. De plus, si vous utilisez un type de document XML, vous devez encoder des signes plus grands que la séquence ]] > .

Le > littéral est légal partout dans le contenu HTML, à la fois dans les valeurs d'attribut et sous forme de texte dans un élément.

Après avoir lu ce qui suit:

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

il semble que les échappements d’entités sont suggérés partout (y compris dans les attributs) pour < > et & amp;

Si vous insistez pour utiliser des expressions régulières (ce qui convient aux opérations de base sur les chaînes), essayez d’utiliser < tag ((\ s + \ w + (\ s * = \ s * (?: ".:". *? " ; | '. *?' | [^ '" \ s] +))?) + \ s * | \ s *) >. *? < \ / tag > . Il doit correspondre parfaitement aux attributs et vous permettre donc d'accéder au contenu interne (bien que vous deviez le placer dans un groupe de capture).

Vous pouvez également utiliser la page du projet Pack Agility en HTML . pour l'analyse HTML, ce que je recommanderais si vous allez effectuer beaucoup d'analyse. Le maintien d'expressions régulières de grande taille peut facilement devenir un casse-tête, mais entre-temps, elles sont également beaucoup plus efficaces si vous en êtes capable.

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

Ne correspond pas à une seule balise, mais à la première balise de début et à la dernière balise de fin pour une balise donnée. Tout comme votre premier match-tag non-glouton, votre entre-deux doit également être écrit non-glouton.

voyez si vous obtenez le même résultat avec & amp; gt; au lieu de >

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top