我試圖爲Digikey編寫一個屏幕抓取工具,該工具將允許我們公司在零件停產時保持定價,零件可用性和產品更換的準確跟蹤。我在Chrome Devtools中看到的XPATH與Firefox上的Firebug以及我的C#程序看到的差異似乎存在差異。HTML Agility Pack屏幕抓取XPATH不返回數據
說我刮目前的頁面是http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=296-12602-1-ND
目前我正在使用的代碼是非常快速和骯髒......
//This function retrieves data from the digikey
private static List<string> ExtractProductInfo(HtmlDocument doc)
{
List<HtmlNode> m_unparsedProductInfoNodes = new List<HtmlNode>();
List<string> m_unparsedProductInfo = new List<string>();
//Base Node for part info
string m_baseNode = @"//html[1]/body[1]/div[2]";
//Write part info to list
m_unparsedProductInfoNodes.Add(doc.DocumentNode.SelectSingleNode(m_baseNode + @"/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]"));
//More lines of similar form will go here for more info
//this retrieves digikey PN
foreach(HtmlNode node in m_unparsedProductInfoNodes)
{
m_unparsedProductInfo.Add(node.InnerText);
}
return m_unparsedProductInfo;
}
雖然我使用顯示的路徑是「正確」當我查看列表時,我一直收到NULL「m_unparsedProductInfoNodes」
任何想法這裏發生了什麼?我還會補充說,如果我在baseNode上做了一個「SelectNodes」,它只會返回一個div,唯一有意義的孩子是「cs = ####」,這似乎隨瀏覽器用戶代理而變化。如果我試圖使用它(在無法識別的瀏覽器的路徑中放置/ cs = 0),它會發出一個合適的聲音,堅持我的表達式不會評估爲一個節點集,但仍然會讓所有數據過去div [2]返回NULL。
指向你想要刮取的HTML的鏈接將有很大幫助。如果它是敏感數據或不容易鏈接,那麼匿名示例將非常有用。無論如何,你'm_baseName'理所當然地只返回'div'元素,因爲這就是XPath表達式得到的東西:任何'html'元素的第一個'body'元素中的第二個'div'元素。應該只有一個'html'元素,所以應該只有一個'div'返回。你在想這個表達是幹什麼的? – Welbog 2010-03-23 13:18:20
http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=296-12602-1-ND是一個部分示例。在檢查它返回的內容後,DIV看起來是正確的,奇怪的是我無法引用任何超過它的東西,而不是NULL。我已經通過LoadHtml存儲了HTML並保存了它。在用Firebug檢查之後,所有東西都看起來像它應該在的位置,所以我暫時排除UserAgent問題。 例如,當我想要查找DK部件號時,我使用路徑: // html [1]/body [1]/div [2]/table [1]/tr [1]/td [1] /表[1]/TR [1]/TD [1]。 返回值爲NULL – Matthias 2010-03-23 13:41:13
另外,在查看m_base div時,它的唯一重要性是CS = ####(似乎隨瀏覽器的useragent設置發生變化),但如果我在我的路徑中包含這一點,我會得到「表達式必須評估爲節點集」。錯誤信息。 – Matthias 2010-03-23 13:48:03