2010-12-08 19 views
2

htmlドキュメントからhtml "フラグメント"を効率的に抽出する方法を探しています。このうち私のfirst implementationはHtml Agility Packを使用していました。これは、大量のhtmlドキュメントで抽出を実行するまで、この問題を攻撃するための合理的な方法であるようでした。ドキュメント全体を解析するのに要する時間のために、パフォーマンスは非常に悪いものでした)。htmlドキュメントからhtmlフラグメントを抽出する

誰でも私の目標を達成するより効率的な方法を提案できますか?

要約すると:私の目的のために

  1. を、HTMLの "フラグメント" は、HTMLの <body>タグ理想的 文書

  2. の内部のすべての内容として定義され、I のコンテンツが変更されていない場合は、 には<html>または<body>が含まれています。(私は私はそもそもHTML フラグメントを渡されたと仮定します)

  3. 私は(文字列として)メモリに利用できるHTML文書全体を持って、私はオンデマンドでストリーミングされることはありません - ので、潜在的なソリューションはそれを心配する必要はありません。

  4. パフォーマンスは非常に重要なので、潜在的な解決方法でこれを考慮する必要があります。

サンプル入力:

<html> 
    <head> 
    <title>blah</title> 
    </head> 
    <body> 
    <p>My content</p> 
    </body> 
</html> 

所望の出力:

<p>My content</p> 

C#やVB.NETでの解決策は歓迎されるであろう。

答えて

2

ほとんどのhtmlはXHTMLに準拠しません。私はHTTPリクエストを行い、得られたテキストを.Contains("<body>").Contains("</body>")のために検索します。これらの2つの場所は、リーダーストリームの開始および停止インデックスとして使用できます。 bodyタグの外では、XMLコンプライアンスについて心配する必要はありません。

+0

私は私の質問でもっと明確にすべきだったと思う。メモリ内にhtmlドキュメントの文字列全体があると仮定できます。私はそれを必要に応じてストリーミングしません。私はそれに応じて私の質問を更新しました。 – DanP

+0

+1。これは、OPが望んでいることをはるかに最速の方法で行うことです。そして、あなたは読者の流れを必要としません。 HTMLを含む普通の文字列はうまく動作します。 – NotMe

+0

これは非常に合理的なアプローチのように思えます。 – DanP

0

WebBrowseコントロールを使用してハックし、webBrowser1.documentプロパティを利用することもできます(ただし、達成しようとしていることはわかりません)。

+0

ブラッド、私はそれがHTMLアジリティパックのルートに行くよりはるかに高速になるとは思っていません。私は、ここでは、私が与えられたテキストを直接操作することを含む、パフォーマンスの良いソリューションを探しています。 – DanP

0

私が正しく覚えていれば、私はXPathNavigatorで過去に似たようなことをしました。あなたが探すために何が必要に/bodyを変えることができる

 XPathDocument xDoc = new System.Xml.XPath.XPathDocument(new StringReader(content)); 
     XPathNavigator xNav = xDoc.CreateNavigator(); 
     XPathNavigator node = xNav.SelectSingleNode("/body"); 

:私はそれがこのようなものに見えたと思います。

+0

これは良い方法ですが、HTMLがXHTMLに準拠していて、特にのような迷惑な閉じられていないタグは含まれていないことに非常に注意する必要があります。 – Tom

+0

これは妥当な解決策(私は確かに性能をテストする必要があります)のように見えますが、留意したようにトムとして;私は与えられたHTMLがXHTMLに準拠していると仮定することができないかもしれません。 – DanP

+0

True;私は入力を順応させるためにルートノードを追加しなければならない状況があることを知っていますが、動作させることができました。 –

関連する問題