1

XPath を使用して、HTML ページからセクションを選択しています。ただし、XPath を使用してノードを抽出すると、HTML タグ自体ではなく、HTMLタグを囲むテキストのみが正しく選択されます。

サンプル HTML

<body>
    <div>
      At first glance you may ask, &#8220;what <i>exactly</i>
      do you mean?&#8221; It means that we want to help <b>you</b> figure...
    </div>
</body>

私は次のXPathを持っています

/body/div

私は次のことを得る

At first glance you may ask, &#8220;what do you mean?&#8221; It means that we want to help figure...

私が欲しい

At first glance you may ask, &#8220;what <i>exactly</i> do you mean?&#8221; It means that we want to help <b>you</b> figure...

<i/>サンプル HTML で、コンテンツに aおよび<b />HTML タグがあることに気付いた場合。これらのタグ内の単語は、コンテンツを抽出すると「失われます」。

それが違いを生む場合、私はPHPでSimpleXMLを使用しています。

4

3 に答える 3

3

XPathは問題ありませんが、/.冗長であるため、ファイナルを削除できます。

/atom/content

すべてのHTMLは<![CDATA ]]>セクション内にあるため、XML DOMには、実際にはテキストしかありません。<i>and<b>タグはタグとして解析されませんが、テキストとして表示されるだけです。CDATAセクションの使用は、XMLが次のように記述されている場合とまったく同じです。

<atom>
    <content>
      At first glance you may ask, &amp;#8220;what &lt;i&gt;exactly&lt;/i&gt;
      do you mean?&amp;#8221; It means that we want to help &lt;b&gt;you&lt;/b&gt; figure...
    </content>
</atom>

したがって、<content>これらのタグを削除するのは、後で要素を使用して行うことです。後でテキストをHTMLとして解析しますか、それともフィルターを介して実行しますか、またはそのようなものですか?

于 2009-10-14T14:15:13.200 に答える
1

SimpleXML はテキスト ノードを好まないため、代わりにカスタム ソリューションを使用する必要があります。

asXML()各要素で使用してからタグdivを削除するか、要素をs にdiv変換してからループして各子をシリアル化できます。HTML エンティティは、可能であれば実際の文字に置き換えられる可能性が高いことに注意してください。divDOMNode$div->childNodes

または、 SimpleDOM プロジェクトを見て、そのinnerHTML()メソッドを使用することもできます。

$html = 
'<body>
    <div>
      At first glance you may ask, &#8220;what <i>exactly</i>
      do you mean?&#8221; It means that we want to help <b>you</b> figure...
    </div>
</body>';

$body = simpledom_load_string($html);

foreach ($body->xpath('/body/div') as $div)
{
    var_dump($div->innerHTML());
}
于 2009-11-12T16:06:09.513 に答える
0

SimpleXML が異なるかどうかはわかりませんが、テキストだけでなく、すべてのノード タイプを選択していることを確認する必要があるようです。標準の XPath では、 /body/div/node() を実行します

于 2009-10-14T19:08:38.437 に答える