2009-10-14 130 views
0

我正在使用XPath從HTML頁面選擇節。但是,當我使用XPath來提取節點時,它正確地只選擇文本圍繞 HTML標籤和而不是 HTML標籤本身。使用XPath抽取具有子節點的完整節點

樣本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...

如果您在樣本HTML注意到沒有在內容<i/><b /> HTML標籤。當我提取內容時,這些標籤中的單詞會「丟失」。

我在PHP中使用SimpleXML,如果這有所作爲。

+0

我無法重現您的結果。用echo $ result(即將simplexmlelement轉換爲字符串)並使用 - > asXML()在輸出中獲得「內部」標籤。你能提供實際的測試代碼嗎? – VolkerK 2009-10-14 14:22:50

+0

好的,所以我轉換爲HTML,然後將其加載到SimpleXML中...編輯該問題以反映此問題。 – null 2009-10-14 18:07:27

回答

2

你的XPath是正常,雖然你可以刪除最後/.因爲這是多餘的:

/atom/content 

所有的HTML是<![CDATA ]]>部分的內部,從而在XML DOM,你其實只文本那裏。 <i><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,還是通過過濾器來運行它,或者類似的東西?

+0

刪除了後期......但問題有所改變。 – null 2009-10-14 18:10:04

+0

我不認爲XPath是問題,所以你可以發佈你的PHP代碼? – 2009-10-14 19:57:49

0

我不知道如果SimpleXML是不同的,但對我來說,似乎你需要確保你選擇的所有節點類型,而不僅僅是文本。在標準的XPath中,你會做/ body/div/node()

1

SimpleXML不喜歡文本節點,所以你必須改用自定義解決方案。

您可以在每個div元素上使用asXML()然後取出div標籤,也可以將div元素轉換爲DOMNode當時的環比$div->childNodes和序列化每一個孩子。請注意,如果可用,您的HTML實體很可能會被實際字符替換。

或者,您可以查看SimpleDOM project並使用其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()); 
}