Ist „>“ (U + 003E Größer-als-SIGN) erlaubt innerhalb eines HTML-Elements Attributwert?
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.
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 > instead of >