2011-04-16 27 views
0

我需要從互聯網的網頁上刮掉一段文字,我使用dom和xpath來查找數據,但是我似乎無法選擇我需要的確切信息。這是我的代碼到目前爲止,問題是與項目(0) - > nodeValue部分 - 這適用於我的另一個頁面,但不是這一個我的其他擦傷。Dom和XPath刮 - 這裏有什麼不對?

$argos_html = file_get_html('http://www.argos.co.uk/static/Product/partNumber/9282197/Trail/searchtext%3EIPOD+TOUCH.htm'); 

$dom_argos= new DOMDocument(); 
$dom_argos->loadHTML($argos_html); 

$xpath_argos = new DOMXpath($dom_argos); 

$expr_currys = "/html/body/div[4]/div[3]/form/div[2]/div/div[5]/ul/li[3]/span"; 
$nodes_argos = $xpath_argos->query($expr_argos); 

$argos_stock_data = $nodes_argos->item(0)->nodeValue; 

任何人都可以告訴我我要去哪裏嗎?因爲我總是得到一個錯誤,它涉及 - > item(0) - > nodeValue;部分,但如果我發表評論,沒有錯誤,但沒有收集數據...

它應該可能只是 - > nodeValue;

我明白這可能歸結爲頁面結構,但我對所有這些都是新的! THX

+0

錯誤可能是因爲你沒有選擇的元素:當沒有節點的時候你不能調用'nodeValue'!您的XPath可能有錯誤 - 這非常複雜,所以我並不感到驚訝。看看你是否能找到一個更簡單的方式來指定你想要的元素。元素ID將是一個很好的開始。 – lonesomeday 2011-04-16 19:34:19

+0

如果您遇到錯誤,請告訴我們它是什麼。這對你來說可能毫無意義,但這對於這個論壇上的某個人來說可能意味着什麼。 – 2011-04-16 22:08:25

回答

1

運行你的代碼,我第一次得到:

Notice: Undefined variable: expr_argos 
Warning: DOMXPath::query() [domxpath.query]: Invalid expression 

所以,首先,確保你正在使用有效期爲你的XPath查詢 - 例如,你應該有這樣的:

$nodes_argos = $xpath_argos->query($expr_currys); 

什麼,而不是你目前有:

$nodes_argos = $xpath_argos->query($expr_argos); 


然後,您會收到以下錯誤:

Notice: Trying to get property of non-object 

以下行:

$argos_stock_data = $nodes_argos->item(0)->nodeValue; 

基本上,這意味着你想讀的屬性,nodeValue上的東西是不是一個對象:$nodes_argos->item(0);

我猜你的XPath查詢無效;所以,對xpath()方法的調用不會返回任何有趣的內容。

您應該檢查您的(相當多時間太容易理解) XPath查詢,確保它匹配HTML頁面中的某些內容。

+0

歡迎您的回覆,哦,不,我複製粘貼,這就是爲什麼currys在那裏,它應該都是argos。我有多個在線零售商,我正在努力尋找。感謝您的解釋,我會繼續努力並編寫更多代碼! – James 2011-04-16 20:55:06

0

當我在Firefox中使用它時,您的XPath很好,但它不適用於DOM,這並不奇怪。我假設你從某種瀏覽器插件獲得了XPath,能夠返回某些元素的路徑。但是,您不應該相信瀏覽器插件返回的XPath,因爲瀏覽器將通過JavaScript修改DOM並在必要時添加隱含值。改用原始的源代碼。

您的XPath在Firefox中評估爲「2天內送貨上門」,這不是我所期望的名爲「stock_data」的變量。但無論如何,這應該做到這一點:

$dom = new DOMDocument; 
libxml_use_internal_errors(TRUE); 
$dom->loadHTMLFile('http://www.argos.co.uk/static/Product/partNumber/9282197/Trail/searchtext%3EIPOD+TOUCH.htm'); 
libxml_clear_errors(); 

$xpath = new DOMXpath($dom); 
$nodes = $xpath->query(
    '/html/body//div[@id="deliveryInformation"]/ul/li[@class="home"]/span' 
); 
echo $nodes->item(0)->nodeValue; // "Home delivery within 2 days" 
+0

您的正確,我使用了一個插件!以及我忘記將其更改爲argos的變量,currys是我試圖從中獲取數據的另一個零售商。另外,我需要一種檢查產品是否有庫存的方法,因此我想如果一個產品有庫存,零售商如何在他們的網站上說,並用IF聲明來檢查,如果最終可行的產品不包含「送貨上門......「,那麼它將返回爲假/無貨!我對這一切都很陌生,並且承擔了一項具有挑戰性的項目!反正很多appriecated您的答覆,現在編碼! – James 2011-04-16 20:58:20

+0

@James請回顧您迄今爲止給出的答案,並接受解決問題或更新問題的答案,並改進問題以指出爲什麼這些問題都不能解決您的問題,因此人們有機會改進答案。謝謝。 – Gordon 2011-04-29 08:11:07