簡體   English   中英

HTML文檔的PHP XPATH省略了所有標記。 我想保留它們

[英]PHP XPATH of HTML document omitting all tags. I want to keep them

我正在使用XPATH解析HTML文檔,我想保留所有內部html標記。

有問題的html是一個包含許多列表元素的無序列表。

<ul id="adPoint1"><li>Business</li><li>Contract</li></ul>

我正在使用以下PHP代碼解析文檔

$dom = new DOMDocument();
@$dom->loadHTML($output);
$this->xpath = new DOMXPath($dom);
$testDom = $this->xpath->evaluate("//ul[@id='adPoint1']");
$test = $testDom->item(0)->nodeValue;
echo htmlentities($test);

由於某種原因,輸出始終從中省略了html標記。 我認為這是因為XPATH不打算以這種方式使用,但無論如何都在這周圍?

我真的想繼續使用XPATH,因為我已經用它來解析頁面的其他區域(單個href元素)沒有問題。

編輯:我知道有一種更好的方法來通過遍歷UL的子元素來獲取數據。 頁面中有一個更復雜的部分,我也想解析(javascript塊),但我試圖提供一個更容易理解的例子。

我想要的實際代碼塊是

<script language="javascript">document.write(rot_decode('<u7>Pbagnpg Qrgnvyf</u7><qy vq="pbagnpgQrgnvyf"><qg>Cu:</qg><qq>(58) 0078 8455</qq></qy>'));</script>

它的問題是它省略了所有結束標記但保留了開始標記。 我猜這是因為XPATH試圖解析內部元素而不是僅僅將其視為字符串。

如果我嘗試選擇腳本元素

$testDom = $this->xpath->evaluate("//div[@id='businessDetails']/script");
$test = $testDom->item(0)->nodeValue;
echo htmlentities($test);

我的輸出將是,您可以看到缺少所有結束標記。

document.write(rot_decode('<u7>Pbagnpg Qrgnvyf<qy vq="pbagnpgQrgnvyf"><qg>Cu:<qq>(58) 0078 8455'));

我認為XPATH不適合我想要的,現在使用PHP Simple HTML DOM Parser ,它更適合於任務。

它維護內部html格式就好了。

foreach($this->simpleDom->find('script[language=javascript]') as $script) {
        echo htmlentities($script->innertext());
}

是的,你是對的,DOM解析子元素(因為它們是元素而不是字符串),從子元素獲取數據的正確方法是遍歷所有元素。 但是,實現這一點並不復雜。
您可能也想嘗試不同的XPath表達式,而不是

//ul[@id='adPoint1']

嘗試

//ul[@id='adPoint1']/li

這將選擇具有實際字符串值的元素。
如果同時給出預期結果(對於ul和腳本),也許你會得到更多的答案。

將Node作為saveHTML()調用中的可選參數傳遞給所有者文檔對象。

string DOMDocument::saveHTML ([ DOMNode $node = NULL ] )

看到...

http://php.net/manual/en/domdocument.savehtml.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM