7

私は、外部Webページのごく一部(ページ全体ではなく、ページのごく一部)のスクリーンスクレイピングを行うためのアプリに取り組んでいます。

だから私はhtmlをスクレイピングするために完全に機能するコードを持っていますが、私の問題は、生のhtmlだけでなく、抽出しているページのセクションをフォーマットするために使用されるCSSスタイルもスクレイピングしたいので、元のフォーマットがそのままの新しいページ。

Firebugに精通している場合は、強調表示したページの特定のサブセットに適用できるCSSスタイルを表示できるため、その方法を理解できれば、それらのスタイルを表示するときに使用できます。私の新しいページのコンテンツ。しかし、私はこれをどのように行うのか分かりません........

4

4 に答える 4

5

今日、Facebook アプリのアプリ ビルダーで動的プレビュー サンプルとして使用するために、Facebook 共有ダイアログをスクレイピングする必要がありました。Firebug 1.5 コードベースを使用して、新しいコンテキスト メニュー オプション「インライン スタイルで HTML をコピー」を追加しました。lib.js から getElementHTML 関数をコピーし、これを行うように変更しました。

  • class、id、style 属性を削除
  • onclick および同様の JavaScript ハンドラを削除します
  • すべてのデータ属性を削除します
  • 明示的な href を削除し、それらを「#」に置き換えます
  • すべてのブロック レベル要素を div に、インライン要素を span に置き換えます (ターゲット ページでスタイルが継承されないようにするため)。
  • 相対 URL を絶対化する
  • 適用されたすべてのデフォルト以外の css 属性を新しいスタイル属性にインライン化します
  • トラバージョン DOM ツリーアップによるスタイリングの親子継承を考慮して、インライン スタイルの肥大化を減らす
  • インデント出力

単純なページではうまく機能しますが、Firebug (または Firefox?) のバグのため、ソリューションは 100% 堅牢ではありません。しかし、すべての癖をデバッグおよび修正できる Web 開発者が操作すれば、間違いなく使用できます。

これまでに見つけた問題:

  • clear css プロパティが発行されないことがあります (レイアウトがかなり崩れます)。
  • :hover およびその他の疑似クラスは、この方法ではキャプチャできません
  • firefox はそのモデルに mozilla 固有の css プロパティ/値のみを保持するため、たとえば、-webkit-border-radius が失われます。これは、CSS パーサーによってスキップされたためです。

とにかく、このソリューションは多くの時間を節約しました。当初、私は手動でスタイルシートの一部を選択し、手動で選択して後処理を行っていました。それは遅く、退屈で、クラスの名前空間を汚染していました。Facebook マークアップを数時間ではなく数分でスクレイピングできるようになり、エクスポートされたマークアップはページの残りの部分に干渉しません。

于 2010-01-05T03:41:24.303 に答える
3

良いスタートは次のとおりです。抽出する予定のHTMLのパッチをパススルーし、各要素(およびそのID /クラス/インラインスタイル)を配列に収集します。ページのスタイルシートからそれらの要素IDとクラスのスタイルをすぐに取得します。

次に、ターゲットパッチの最も外側の要素から、同様の方法でDOMの残りの要素を上に向かって進み、最終的には本文とHTML要素に至るまで、最初の配列と比較します。ターゲットパッチ内で宣言されていないスタイルまたはその適用されたスタイルを収集します。

また、*宣言を確認し、それらも取得する必要があります。次に、スタイルを最終的な出力に再適用するときは、DOM階層の低から高にスタイルを収集し、高から低に再適用する必要があるため、正しい順序で適用することを確認してください。 。

于 2008-11-18T17:36:55.150 に答える
3

簡単なハックは、CSS ファイルをプルダウンして、データの表示に使用しているページに適用することです。干渉を避けるために、ページを表示する必要がある場所ならどこでも IFrame にページをロードできます。もちろん、私はこのコードの意図を疑問視しなければなりません。スクレイピングしている情報を再公開することは許可されていますか?

于 2008-11-18T18:02:45.517 に答える
-1

「計算されたスタイル」を決定する方法があれば、効果的にスタイル シートを破棄し、計算されたスタイルのすべてのプロパティを使用してインライン スタイルを適用できます。

しかし、これはお勧めしません。とてもむくみます。

于 2008-11-18T18:12:26.903 に答える