2011-05-12 39 views
2

我試圖使用HTML敏捷包從this website刮取價格字段。使用HTML敏捷包的XPath查詢問題

我的代碼如下;

var web = new HtmlWeb(); 
var doc = web.Load(String.Format(overClockersURL, componentID)); 
var priceContent = doc.DocumentNode.SelectSingleNode("//*[@id=\"prodprice\"]"); 

我用Firebug的 「複製爲XPath的」 功能獲得的XPath查詢。

我遇到的問題是,的SelectSingleNode將返回 - 它似乎並沒有找到查詢指定的元素。我對於爲什麼有點難以理解,但是我沒有太多的XPath經驗,所以我會感謝一些指針,指出我做錯了什麼。

+1

當一個空集合會更好時,HTML Agility Pack返回null是我的一個煩惱。您是否嘗試過試驗XPath並用已知的元素名稱替換「*」,例如如果您知道有一個ID爲「prodprice」的div用「div」替換「*」以查看您是否得到不同的結果? –

+0

對不起,不得不在最後的評論中添加空格,以使星號顯示,因爲它將它們解釋爲斜體標記的開始/結束。 –

+0

Hi @Colin Mackay:我試過「// span [@ id ='prodprice']」,但結果相同 - 返回null:S –

回答

3

當發生這種情況,你應該檢查網頁是否被正確加載(你說你是通過HTTP代理服務器?)

嘗試的doc.DocumentNode.OuterHtml內容寫入到一個文本文件,所以你可以看到,如果頁面正在正確加載。也許你得到一個錯誤頁面,而不是原始頁面。

+1

再次感謝奧斯卡的建議 - 事實證明,我只是收到一個錯誤頁面,因爲我沒有明確指定在我的系統設置中設置的代理服務器。做完之後(通過Load方法的一個重載),一切按預期工作。 –

+1

感謝兄弟:) –

1

如果我運行此代碼:

var web = new HtmlWeb(); 
    var doc = web.Load("http://www.overclockers.co.uk/showproduct.php?prodid=GX-033-HS"); 
    var priceContent = doc.DocumentNode.SelectSingleNode("//*[@id=\"prodprice\"]"); 
    Console.WriteLine("price=" + priceContent.InnerHtml); 

它輸出:

price=529.99 

所以它似乎是工作。您也可以使用//span[@id=\"prodprice\"]",因爲它避免了所有非SPAN標籤。

+0

Hi @Simon Mourier - 你運行的是什麼版本的HTML敏捷包?我正在使用當前的穩定版本1.4.0.0,並且在priceContent的結果上方運行代碼對我而言爲空。 –

+0

@ C.McAtackney - 我正在運行1.3.0.0 - 我寫的:-) –

+0

你需要獲得最新版本;)我想我可能有一些想法是怎麼回事; HtmlWeb.Load如何與代理交互?它是否會默認使用系統設置,或者爲了通過系統代理路由請求,您還需要做些額外的事情嗎? –