2011-11-20 274 views
0

我想寫一個機器人,每天將獲取html解析它。 現在爲解析HTML我可以使用只是字符串函數,如爆炸或校正表達式,但我發現DOM XPath代碼更乾淨,所以現在我可以配置所有的網站,我必須去掉蜘蛛和標籤,我必須去掉像:Dom和xpath查詢爲html解析

'http://examplesite.com' => '//div/a[@class="articleDesc"]/@href' 

因此,代碼看起來像這樣

@$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
$tags = $xpath->query('//body/div[@class="articleDesc"]'); 


foreach ($tags as $tag) 
    echo $tag->nodeValue . "\n"; 

所以我得到的所有div標籤與類文章的描述,這是我很大的。但我注意到div標籤內的所有html標籤都被剝離了。 我想知道如何獲得我正在查看的div的全部內容。

我也很難看到$ xpath-> query()的任何適當的文檔來查看如何形成字符串。這個php網站並沒有講述它的確切形式。儘管如此,我的主要問題我

+1

查看http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument –

+0

及其對應物http://stackoverflow.com/questions/5404941/php-domdocument-outerhtml-for-element/5404962 #5404962 – Gordon

+1

XPath 1.0規格:http://www.w3.org/TR/xpath/ – Gordon

回答

2

簡單的答案是:

foreach ($tags as $tag) 
    echo $dom->saveXML($tag); 

如果你想HTML剝開一個標籤時,XPath的是

//a[@class="articleDesc"] 

這是假設的一個標籤有class屬性

+0

非常感謝! –

1

嘗試使用http://www.php.net/manual/en/simplexmlelement.asxml.php

或者alternative

function getNodeInnerHTML(DOMNode $oNode) { 
    $oDom = new DOMDocument(); 
    foreach($oNode->childNode as $oChild) { 
    $oDom->appendChild($oDom->importNode($oChild, true)); 
    } 
    return $oDom->saveHTML(); 
} 
+0

meh ..這會工作的方式,但對於我來說,完美的方式是從'http://examplesite.com'=>'// div/a [@ class =「articleDesc」]/@ href'獲取匹配元素的html未剝離字符串列表。 。我想知道我該怎麼做 –

+0

我可能在這裏弄錯了,但是這並不只是要求你使用上面的函數之一來獲取與你的XPath匹配的父元素的innerHTML? –

+0

我認爲不是....匹配xpath的父元素的內部html會返回其中的所有html。然而,我想要得到所有類標題爲desc的div標籤,例如... –

0

這應該加載所有的內標籤的爲好。雖然它不是DOM,但它們是可以互換的。稍後,您可以將其重新轉換回DOM。

$xml=simplexml_load_string($html); 
$tags=$xml->xpath('//body/div[@class="articleDesc"]'); 
+0

發出錯誤。 expath不支持$ xml。如果我在第二行之前嘗試$ xml = dom_import_simplexml($ xml),它也不起作用 –

+0

準確的錯誤將會有幫助。第一行將'$ html'字符串導入到simplexml中,如果它不是字符串,請嘗試'simplexml_load_file'。第二行直接從你的複製,但轉換爲simplexml。誠然,我沒有自己運行它,但這是我在工作中使用的相同的代碼,並且它適用於我。 ''dom_import_simplexml($ tags)''應該只在simplexml被加載後使用,並且假設你在DOM中有一些你想要做的事情,否則它不是必需的,只是包含在你想要在加載後切換回DOM的情況下結果。 – mseancole

+0

simplexml_load_string($ html)返回false,當我把它放入xpath()後,當然會打破... 它也給出了很多警告,如: Warning:simplexml_load_string()[function.simplexml-load-string]:實體:第36行:解析器錯誤:打開和結束標記不匹配:META第8行和HEAD在/usr/share/nginx/html/synd/robots/robot.php上線25 我知道html可能不完美可能是simplexml返回false的原因,但它是一個合適的html網頁wtich在瀏覽器中呈現 –

0

你可以使用這個真棒蜘蛛框架(在Python中)Scrapy