12

つまり/<tag[^>]*>.*?<\/tag>/、正規表現を使用tagして、ネストされた要素を含まない html 要素に一致させることができますtagか?

例 (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>

正規表現:

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

そしてスクリーンスクレーパー:

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

どちらも同じ出力が得られます。

1
">2

期待される出力:

1
2

w3c言います:

属性値は、テキストにあいまいなアンパサンドを含めることができないという追加の制限を除いて、テキスト参照と文字参照の混合です。

4

7 に答える 7

11

はい、許可されています (W3C Validator はそれを受け入れ、警告のみを発行します)。

エスケープされておら<ず、>コメント内でも許可されているため、このような単純な正規表現はだまされる可能性があります。

BeautifulSoup がこれを処理しない場合、それはバグであるか、属性の終了引用符の欠落に対する耐性を高めるための意識的な設計上の決定である可能性があります。

于 2008-10-19T23:10:50.607 に答える
4

リテラル>は、属性値の内部と要素内のテキストの両方で、html コンテンツのどこでも有効です。

于 2008-09-18T17:33:43.107 に答える
3

私はそれが有効だと信じており、W3C バリデーターも同意していますが、この情報の信頼できる情報源は ISO 8879:1986 標準であり、費用は ~150EUR/210USD です。とにかく、それらをエンコードすることは間違っていないので、疑わしい場合はエンコードしてください。さらに、XML ベースのドキュメント タイプを使用している場合は、シーケンス内の大なり記号をエンコードする必要があります]]>

于 2008-09-18T17:14:08.270 に答える
2

どうしても正規表現 (基本的な文字列操作に適しています) を使用したい場合は、 を使用してみてください<tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>。属性と完全に一致する必要があるため、内部コンテンツにアクセスできます (ただし、キャプチャ グループに入れる必要があります)。

HTML の解析にHtml Agility Packを使用することもできます。これは、多くの解析を行う場合にお勧めします。大規模な正規表現を維持することは簡単に頭の痛い問題になる可能性がありますが、それができればはるかに効果的です。

于 2008-09-25T02:13:56.730 に答える
2

以下を読んだ後:

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

< > および & のエンティティエスケープは、どこでも (属性を含む) 提案されているようです

于 2008-09-18T17:12:10.303 に答える
0
yeah except /<tag[^>]*>.*?<\/tag>/

単一のタグには一致しませんが、特定のタグの最初の開始タグと最後の終了タグに一致します。最初の非貪欲なタグマッチと同様に、中間も非貪欲に記述する必要があります。

于 2008-09-18T17:10:51.650 に答える
0

> を使用して同じ結果が得られるかどうかを確認します。>の代わりに

于 2008-09-18T17:11:00.510 に答える