1

この問題をどのように解決しますか?

あなたはブログのHTMLをスクレイピングしています。ブログのHTMLの一部はブログ投稿であり、一部は書式設定、サイドバーなどです。HTML内のどのテキストがどの投稿に属しているか(つまり、パーマリンク)を識別できるようにする必要があります。

私はあなたが何を考えているか知っています:あなたはただRSSを見て、HTMLを完全に無視することができます!ただし、RSSには非常に短い抜粋しか含まれていないか、興味のあるリンクが削除されていることがよくあります。同じページのHTMLとRSSを一緒に使用して、RSSの抜粋を本質的に無効にします。

RSSエントリは次のようになります。

タイトル
ポストボディの抜粋
パーマリンク

HTMLのブログ投稿は次のようになります。

タイトル(パーマリンクで囲まれているかもしれません)
..。
パーマリンク、多分
..。
ポストボディ
..。
パーマリンク、多分

したがって、HTMLページには同じフィールドが含まれますが、パーマリンクの配置は事前にわかりません。フィールドは、ほとんどがHTMLと空白であるノイズテキストで区切られますが、「投稿者Johnny」などの追加のメタデータも含まれる可能性があります。 "または日付またはそのようなもの。以下で説明するように、テキストはHTMLとRSSでわずかに異なる場合もあります。

追加のルール/警告:

  • タイトルは一意でない場合があります。これはあなたが思っているよりも頻繁に起こります。私が見た例:「月曜日のまとめ」、「TGIF」など。
  • タイトルは空白のままにすることもできます。
  • RSSの抜粋もオプションですが、少なくとも空白以外の抜粋または空白以外のタイトルが必要であると想定しています。
  • RSSの抜粋には投稿コンテンツ全体が含まれている可能性がありますが、投稿本文の先頭の短い抜粋が含まれている可能性があります
  • パーマリンクは一意である必要があり、HTMLとRSSの両方で同じである必要があると想定します。
  • タイトルと抜粋および投稿の本文は、RSSとHTMLでわずかに異なる形式になっている場合があります。例えば:
    • RSSでは、タイトルまたは本文の内部のHTMLが削除されているか、HTMLページにHTMLが追加されているか(投稿本文の最初の文字を何かで囲むなど)、わずかに異なる形式になっている可能性があります。
    • テキストは、RSSではutf8であるのに対し、HTMLでは非ASCII文字は常にアンパサンドエンコーディングを使用してエンコードされるなど、わずかに異なる方法でエンコードされる場合があります。ただし、これは非ASCII文字がまれな英語のテキストであると想定してください。
    • 正しくエンコードされていないWindows-1252の恐ろしさがある可能性があります。これは、中引用符のような記号文字でよく発生します。ただし、ほとんどのテキストはASCIIであると想定しても問題ありません。
    • 特にタイトルでは、どちらの方向にもケースが折りたたまれている可能性があります。したがって、HTMLページではタイトルをすべて大文字にすることはできますが、RSSではできません。
  • RSSフィードとHTMLページのエントリ数は同じであるとは想定されていません。古いエントリが多かれ少なかれある可能性があります。両方に表示される投稿のみを取得することを期待できます。
  • RSSは遅れる可能性があります。RSSフィードにまだ表示されていない新しいエントリがHTMLページにある可能性があります。これは、RSSがFeedburnerを介してシンジケートされている場合に発生する可能性があります。繰り返しになりますが、RSSとHTMLの両方に表示される投稿のみを解決することが期待できます。
  • 投稿の本文は非常に短くても長くてもかまいません。

100%の精度は制約ではありません。ただし、精度が高いほど優れています。

さて、あなたはどうしますか?

4

2 に答える 2

1

主要なブログ エンジンごとにスクレイパーを作成します。ページごとに 1 つの投稿の本文から始めます。

運が良ければ、エンジンは合理的な XHTML を提供するので、記事に対応するノードを取得するための便利な XPath 式をいくつか考え出すことができます。そうでない場合は、TagSoupまたはTidyがそれを整形式の XML に強制するのではないかと思います。

そこから、メタデータと全文を探すことができます。これにより、ヘッダー/フッター/サイドバー/ウィジェット/広告が安全に削除されますが、埋め込みオブジェクトなどが残る場合があります。

また、ページを記事のメタデータ、テキスト、コメントなどにセグメント化し、それをかなり適切な RSS/Atom アイテムに配置することもかなり簡単 (TM) である必要があります。

これは、RSS フィード (非全文) を取得して全文 (公式の RSS で指定されたパーマリンクをたどることにより) に変換するための基礎となります。

ブログ エンジン用のスクレイパーができたら、ディテクターの作成を検討することができます。これは、「与えられたページで、どのブログ エンジンで公開されたか」の基礎となるものです。

十分な数のスクレーパーとディテクターがあれば、特定の RSS/Atom フィードを指定してフルテキスト フィードに変換できるはずです。

ただし、このアプローチにはいくつかの問題があります。

  • ビッグ 5 のブログエンジンをターゲットにできるかもしれませんが、それらでカバーされていないブログがいくつかあるかもしれません。独自のブログ エンジンを作成する人は、それぞれ独自のスクレーパーを必要とします。
  • ブログ エンジンのバージョンが変更されるたびに、検出器とスクレイパーを変更する必要があります。より正確には、新しいスクレーパーと検出器を追加する必要があります。検出器は、同じエンジンの 1 つのバージョンと次のバージョンを区別するためにますます面倒になる必要があります (たとえば、スラッシュコードが変更されるたびに、通常は HTML が変更されますが、異なる サイトでは異なるバージョンのスラッシュが使用されます)。

まともなフォールバックを考えようとしていますが、できたら編集します。

于 2009-01-28T19:54:00.257 に答える
0

RSSは、XPath 任意の XML パーサー (または正規表現ですが、推奨されていません) を使用して解析するのは実際には非常に簡単です。 <item> タグを調べて、 <title>、<link>、<description> を探します。

その後、それらをデータベース内の異なるフィールドとして投稿するか、HTML に直接マージすることができます。<description> が欠落している場合は、リンクをスクレイピングできます (1 つの方法は、複数のページを比較して、HTML のレイアウト部分を取り除くことです)。

于 2008-12-14T10:42:52.230 に答える