5

さまざまなブログから HTML を取得しようとしていますが、異なるプロバイダーが同じタグを異なる方法で使用していることに気付きました。

たとえば、次の 2 つの主要なプロバイダーでは、メタ名ジェネレーター タグを異なる方法で使用しています。

  • ブロガー: <meta content='blogger' name='generator'/>(最初にコンテンツ、後に名前、そしてそうです、一重引用符!)
  • WordPress: <meta name="generator" content="WordPress.com" />(名前が先、内容が後)

すべてのケース (一重/二重引用符、行の最初/最後) のコンテンツの値を抽出する方法はありますか?

PS私はJavaを使用していますが、一般的に正規表現の場合、答えはおそらくより多くの人に役立つでしょう。

4

8 に答える 8

14

答えは、正規表現を使用しないことです。

真剣に。SGML パーサーを使用するか、有効な XML であることがわかっている場合は XML パーサーを使用してください (おそらくほとんど真実ではありません)。あなたは絶対に台無しにし、それを正しくしようとして多くの時間を無駄にします. すでに利用可能なものを使用するだけです。

于 2008-08-28T02:31:40.643 に答える
3

実際には、おそらく、ページの DOM 内の各ノード (したがってノード属性) を検査できる、ある種の HTML パーサーを使用する必要があります。私はしばらくこれらを使用していないので、長所と短所はわかりませんが、ここにリストがありますhttp://java-source.net/open-source/html-parsers

于 2008-08-28T02:30:42.080 に答える
2

注: 単一引用符 (値にスペースが含まれていない場合は引用符なしでも) は、W3C HTML 仕様に従って有効です。見積もり:

デフォルトでは、SGML は、すべての属性値が二重引用符 (ASCII 10 進数 34) または単一引用符 (ASCII 10 進数 39) のいずれかを使用して区切られることを要求します。

また、属性の順序を逆にすることができ、他の属性をタグに表示できることを忘れないでください。

于 2008-08-28T02:56:03.127 に答える
2

XHTML 標準によれば、これらの違いはそれほど重要ではありません。

言い換えれば、それらはまったく同じものです。

また、二重引用符を一重引用符に置き換えても同じです。

xml ドキュメントを「正規化」する一般的な方法は、ドキュメントをその Infoset 表現として扱う API を使用してそれを切り捨てることです。DOM スタイルと SAX スタイルの両方の API がそのように機能します。

それらを手動で (または RegEx で) 解析したい場合は、それらすべてをコード内で複製する必要があり、私の意見では、それは実用的ではありません。

于 2008-08-28T02:28:16.827 に答える
1

JavaのHTMLEditorKitを試してみることをお勧めします。構文解析があなたが探しているものを提供するかどうかを確認するために実験するのは簡単です。

于 2008-08-28T03:24:04.213 に答える
0

わかりました。言語に依存しないものを探しているので、次のような正規表現を試して/<meta\s.*content=.*>/、その結果を取得し、探している特定の値を解析できます。私は決して正規表現の専門家ではないので、おそらくもっと良い方法がありますが、http://www.codehouse.com/webmaster_tools/regex/のツールを使用する際に、提供された両方の文字列を照合しました。

于 2008-08-28T03:20:22.693 に答える
0

正規表現を使用する必要がある場合は、コンテンツ部分だけを取得するための正規表現を次に示します。

content\s*=\s*['"].*?['"]

戻り値

content = "blogger"

content='Worpress.com'

それぞれ。私は正規表現の専門家ではありませんが、正規表現で例を挙げれば、正規表現を取得できます。

引用符の間にあるすべてのものを、選択した方法で取得できるようになったら、別の正規表現(その時点では不道徳です)でも、文字をループするだけでもかまいません。

于 2008-08-28T03:38:00.547 に答える
0

Java を使用している場合は、「野生で見つかった [解析] HTML」の SAX 準拠のパーサーであるtagsoupを参照することをお勧めします。

于 2008-08-28T12:53:47.090 に答える