Ist „>“ (U + 003E Größer-als-SIGN) erlaubt innerhalb eines HTML-Elements Attributwert?

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

  •  01-07-2019
  •  | 
  •  

Frage

Mit anderen Worten kann man /<tag[^>]*>.*?<\/tag>/ regex paßt das tag HTML-Element benutzen, die nicht verschachtelte tag Elemente enthalten?

Zum Beispiel (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

Und Bildschirm-Scraper:

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

Beide geben die gleiche Ausgabe:

1
">2

Erwartete Ausgabe:

1
2

w3c sagt:

  

Attributwerte sind eine Mischung aus Text   und Zeichenreferenzen, außer mit   die zusätzliche Einschränkung, dass die   Text kann nicht eine mehrdeutige enthalten   Ampersand.

War es hilfreich?

Lösung

Ja, es ist erlaubt (W3C Validator es akzeptiert, gibt nur eine Warnung).

Unescaped < und > sind auch im Inneren Kommentare erlaubt, so so einfach regexp täuschen kann.

Wenn BeautifulSoup dies nicht umgehen, könnte es ein Problem sein, oder vielleicht eine bewusste Design-Entscheidung, um es belastbarer Schluss Anführungszeichen in Attributen fehlen.

Andere Tipps

Ich glaube, das ist gültig, und der W3C-Validator übereinstimmt, aber die maßgebliche Quelle für diese Informationen ist die ISO 8879: 1986 Norm, die ~ 150EUR / 210USD kostet. Unabhängig davon ist es nicht falsch, sie zu kodieren, so dass, wenn Sie Zweifel haben, kodieren. Außerdem, wenn Sie einen XML-basierter Dokumententyp verwenden, müssen Sie Größer-als-Zeichen in der Sequenz ]]> kodieren.

Wörtliche > legal ist überall in HTML-Inhalt, sowohl innerhalb als Attributwerte und als Text innerhalb eines Elements.

Nach dem Lesen der folgenden:

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

es sieht aus wie Unternehmen entkommen überall vorgeschlagen werden (einschließlich in Attributen) für <> und &

Wenn Sie sich mit regulären Ausdrücken bestehen (die für den Grund String-Operationen geeignet ist) versuchen <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag> verwenden. Es soll Attribute passen perfekt und daher mit dem Sie die inneren Inhalte zugreifen (auch wenn Sie es in einer Capture-Gruppe setzen müssen).

Sie können auch die Html Agility Pack- für HTML-Parsing, die ich würde empfehlen, wenn Sie eine Menge von Parsing tun werden. leicht Kopfschmerzen werden kann große reguläre Ausdrücke beibehalten wird, aber in der Zwischenzeit sind sie auch wesentlich effektiver, wenn Sie in der Lage sind, dies zu tun.

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

Werde nicht einen einzigen Tag, paßt aber den ersten Start-Tag und den letzten End-Tag für einen bestimmten Tag entspricht. Genau wie Ihr erstes nicht-gieriges tag-Spiel, Ihre in-between soll auch geschrieben nicht gierig werden.

see if you get the same result using &gt; instead of >

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top