2012-02-11 9 views
5

有効なURLを処理するために必要なテキストがたくさんあります。大きなテキスト/ HTMLファイルからURLを抽出する

入力がぼんやりとHTMLになっています。そのほとんどはhtmlです。しかし、実際に HTMLが有効ではありません。

私はregexで問題を起こそうとしています。

あなたが言う前に(あるいは悲鳴 - 私は他のHTML +正規表現の質問を読んだ)「はパーサを使用する」、あなたが考慮する必要がある一つのことがあります:
私が働いているファイルがあるが約5 GBのサイズ

私はそれを処理するパーサーは何もなく、または何日もかかることはありません。さらに、テキストコンテンツが,htmlであるが、必ずしも有効htmlであるということは、非常に寛容なパーサーが必要であることを意味する。最後に、すべてのリンクが必ずしも<a>タグにあるとは限りません(一部は平文でもよい)。

私は本当に文書の構造には気をつけませんが、リンクを抽出する優れた選択肢がありますか?

今私は正規表現使用しています:(はgrep -Eに)
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
それでもそれを、私はそれが約3時間のために実行させることの後にあきらめました。

Regexエンジンのパフォーマンスには大きな違いがありますか?私はMacOSのコマンドラインgrepを使用しています。パフォーマンスが向上する他の互換性のある実装がある場合は、オプションになる可能性があります。


言語/プラットフォームについてはあまり気にしませんが、MacOS /コマンドラインはうまくいくはずです。

+0

スキームなしで物事をキャッチする必要がありますか? (いいえ「http://」はありません) – icktoofay

+0

@icktoofay - それはいいと思います。 –

答えて

2

私はカップルのgrepが一緒にコマンド文字列を巻き上げる:

pv -cN source allContent | grep -oP "(?:\"([^\"' ]*?)\")|(?:'([^\"' ]*?)')|(?:([^\"' ]*?))" | grep -E "(http)|(www)|(\.com)|(\.net)|(\.to)|(\.cc)|(\.info)|(\.org)" | pv -cN out > extrLinks1

私は私の進行状況インジケータを与えることpvを使用。

grep -oP "(?:\"([^\"' ]*?)\")|(?:'([^\"' ]*?)')|(?:([^\"' ]*?))"

は、単語または引用されたテキストのように見える何かを引き出し、そして何のスペースを持っていません。

grep -E "(http)|(www)|(\.com)|(\.net)|(\.to)|(\.cc)|(\.info)|(\.org)"
URLのように見えるものはすべてフィルタリングします。

ファイルへ

最後に、
pv -cN out > extrLinks1
出力すると、素敵な活動メーターを提供します。

おそらく、生成されたファイルをsort -uにプッシュすると重複したエントリが削除されますが、別のレイヤーを追加するので、最後に文字列を挿入したくありませんでした。ファイル全体をバッファリングすると、クラッシュする可能性があります。


とにかく、今のところ実行中は、約40分かかるようです。私は前にpvについて知りませんでした。それは本当にクールなユーティリティです!

0

私はあなたが正しい軌道にいると思って、grepは5Gbファイルを処理できるはずです。あなたの正規表現を簡素化して、|演算子と多くのかっこを避けてください。また、headコマンドを使用して、ファイル全体に対して実行する前に最初の100Kbを取得し、パイプを使用してgrepsを連鎖させて、より具体的にします。たとえば、

head -c 100000 myFile | grep -E "((src)|(href))\b*=\b*[\"'][\w://\.]+[\"']" 

超高速ではありません。

関連する問題