3

かなりくだらない HTML 用のカスタム パーサー/データ エクストラクタを作成しています。

HTMLを変更することは問題外です。

私が乗り越えなければならなかったフープの詳細は割愛しますが、今では当初の目標にかなり近づいています. 私は、DOMDocument getElementByName、正規表現の置換 (わかっている、わかっている...)、および XPath クエリを組み合わせて使用​​しています。

ドキュメントの本文からすべてのテキストを取得する必要があります。少なくとも抽象的には、ナビゲーションは別個のエンティティのままにしておきたいと思います。これが私が今していることです:

$contentnodes = $xpath->query("//body//*[not(self::a)]/text()|//body//ul/li/a");

foreach ($contentnodes as $contentnode) {    
    $type      = $contentnode->nodeName;
    $content   = $contentnode->nodeValue;

    $output[] = array( $type, $content);
}

もちろん、ページ上のすべてのリンクを異なる方法で処理することを除いて、これは機能します。ナビゲーションに対してのみそれを行いたいです。

そのクエリの最初の部分で、 の前に、 を除くの子の|すべてのテキスト ノードを取得するように指示するために、どの XPath 構文を使用できますか。body ul > li > a

コンテンツについて知識に基づいた推測を行うために、pタグやタグ、またはそのような賢明なものの存在に依存することはできないことに注意してください.h1

ありがとう

更新:以下の@ hr_117の回答が機能します。not次のように複数のステートメントを使用できることもわかりました。

//body//text()[not(parent::a/parent::li/parent::ul)][not(parent::h1)]

4

2 に答える 2

2

次のようなことを試すことができます:

//body//text()[not(parent::a/parent::li/parent::ul)]|//body//ul/li/a
于 2013-06-19T17:55:55.730 に答える
1
//body//*[not(self::a/parent::li/parent::ul)]/text()[normalize-space()]|//body//ul/li/a

(テスト)

于 2013-06-19T18:12:53.877 に答える