0

私はいくつかのhtmlをテキストとリンクと混合していて、リンクを削除せずにリンクされた単語でテキストをそのまま抽出し、後で同じ場所に戻すためにいくつかのクレイジーなことをしたいと思います。

HTMLは次のようになります。

<div id="i want what is inside here">
<h3>some text</h3>
<div>more text with a <a href="url">link</a></div>
<p>some more text<br />
<a href="url">another link</a> here...</p>
</div>

そして、私が欲しかった出力は次のとおりです。

some text
more text with a <a href="url">link</a>
some more text
<a href="url">another link</a> here...

最近、HTMLAgilityPackを使用してテキストを抽出する方法を知っています。先祖の使用方法について多くの新しいことを学び、xpathやその他のことを先取りして、不思議に思いました。

xpathを使用して上記の目的の出力を取得することは可能ですか、それともどのようにすればよいですか?

これに使用できるxpath条件がない場合は、テキストを抽出してからリンクを抽出し、テキスト内のリンクの内部テキストの一致をリンクに置き換えることを考えていました(信頼性は低いと思います)が、それは可能性があると考えた1つの方法でしたやった、あなたは私に何をするようにアドバイスしますか?

4

1 に答える 1

2

XMLパス言語であるXPathは、XMLドキュメントからノードを選択するためのクエリ言語です。

ルールに従ってドキュメントを変換する必要があります。xpathを使用して変換するノードを選択することはできますが、xpathを使用してこの変換を実行することはできませんでした。

これを行うには、ドキュメントノードを最も深いノードからルートノードまで反復処理し、これが<a>タグでない場合は、その内部HTMLに置き換えます。

幸い、AgilityPackは、ドキュメントで見つかったノードの順序でノードを列挙しているようです。これは、ノードのリストを逆にすることで必要な順序を取得できることを意味します。見る:

// getting the non-anchor nodes in the reversed order
var nodes = doc.DocumentNode.SelectNodes("//*[name()!='a']")
    .Reverse()
    .ToList();

// replacing with the inner html
foreach (var node in nodes)
{
    var replacement = doc.CreateTextNode(node.InnerHtml);
    node.ParentNode.ReplaceChild(replacement, node);
}

// and getting the output
var output = doc.DocumentNode.OuterHtml;

これにより、次のようなものが得られます。

some text
more text with a <a href='url'>link</a>
some more text
<a href='url'>another link</a> here...

ただし、変換後、ドキュメントはテキストノード全体になります。HTMLフラグメントとして使用する必要がある場合は、変更したドキュメントから新しいドキュメントを作成する必要があります。

于 2012-07-30T16:51:15.323 に答える