2010-03-23 63 views
2

我試圖爲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。

+0

指向你想要刮取的HTML的鏈接將有很大幫助。如果它是敏感數據或不容易鏈接,那麼匿名示例將非常有用。無論如何,你'm_baseName'理所當然地只返回'div'元素,因爲這就是XPath表達式得到的東西:任何'html'元素的第一個'body'元素中的第二個'div'元素。應該只有一個'html'元素,所以應該只有一個'div'返回。你在想這個表達是幹什麼的? – Welbog 2010-03-23 13:18:20

+0

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

+0

另外,在查看m_base div時,它的唯一重要性是CS = ####(似乎隨瀏覽器的useragent設置發生變化),但如果我在我的路徑中包含這一點,我會得到「表達式必須評估爲節點集」。錯誤信息。 – Matthias 2010-03-23 13:48:03

回答

0

嘗試使用此XPath表達式:

/html[1]/body[1]/div[2]/cs=0[1]/rf=141[1]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1] 

在Firefox中使用谷歌Chrome開發者工具和Firebug的,好像網頁有一個「CS」和第一表之前,「RF」的標籤。喜歡的東西:

<cs="0"> 
    <rf="141"> 
    <table> 
    ... 
    </table> 
    </rf> 
</cs> 

有一些可能是知道什麼時候要解析 HTML文件,按預期你沒有得到結果發生了什麼有用的。在這種情況下,我只是做了:

string xpath = ""; 

//In this case I'll get all cells and see what cell has the text "296-12602-1-ND" 

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//td")) 
{ 
    if (node.InnerText.Trim() == "296-12602-1-ND") 
     xpath = node.XPath; //Here it is 
} 

或者您也可以調試文件加載後您的應用程序,並經過每個子節點,直到找到你想從信息的節點。如果您只是在找到InnerText時設置斷點,則可以通過父母,然後繼續查找其他節點。我通常會在「監視」窗口中輸入手動命令並使用樹視圖進行導航以查看屬性,屬性和子視圖。

+0

我實際上是在昨天完成這項工作,並且是在逐步完成XPATH樹時顯示CS和RF標籤。但是,如果您將它們包含在內,那麼它會抱怨它「不是節點集」。如果你忽略它們,它不再抱怨,但我得到NULL。我很困惑。今天早上我正在嘗試python /美麗的湯,看看它是否僅僅是HTML敏捷性中的一個錯誤。此外,digikey已經完成了一個很好的工作,從桌面標籤中刪除任何有用的信息,將其減少到最低限度

,沒有ID或任何我能看到的可以幫助識別它們的東西,除了直接路徑。 – Matthias2010-03-25 11:25:04

0

只是爲了更新:

我從C#轉換成多一點友好的Python(我與編程經驗彙編,C和Python,整個OO事情是全新的),並設法糾正我的XPath的問題。標籤確實是問題,但幸運的是它是獨一無二的,所以有一點正則表達和一條刪除線,我的狀態良好。我不確定爲什麼這樣的標籤會破壞XPATH。如果有人有一些見解,我想聽聽。