2014-06-11 87 views
0

我遇到了一個相當奇怪的問題。這是很難解釋,請忍耐一下,但基本上這裏是一個簡要的介紹:使用Async,HtmlAgilityPack和XPath解析

  • 我是新來的異步編程,但在我的代碼
  • 我以前用過HtmlAgilityPack無法找到一個問題,但從來沒有.NET 4.5版本。
  • 這是一個學習項目,我不想刮或任何類似的東西。

基本上,正在發生的事情是這樣的:我從互聯網上檢索頁面,通過流加載到一個HtmlDocument,然後使用XPath表達它檢索某些HtmlNodes。這裏是一塊簡化代碼:

  myStream = await httpClient.GetStreamAsync(string.Format("{0}{1}", SomeString, AnotherString); 

      using (myStream) 
      { 
       myDocument.Load(myStream); 
      } 

的HTML被正確retreived,但通過XPath的萃取HtmlNodes得到他們HTML錯位。這裏是HTML的一個樣片,我從小提琴手所採取的迴應了:

    <div id="menu"> 
    <div id="splash"> 
     <div id="menuItem_1" class="ScreenTitle" >Horse Racing</div> 
     <div id="menuItem_2" class="Title" >Wednesday Racing</div> 
     <div id="subMenu_2"> 
     <div id="menuItem_3" class="Level2" >&#187; <a href="../coupon/?ptid=4020&amp;key=2-70-70-22361707-2-20181217-0-0-1-0-0-4020-0-36200255-1-0-0-0-0">21.51 Britannia Way</a></div> 
     <div id="menuItem_4" class="Level2" >&#187; <a href="../coupon/?ptid=4020&amp;key=2-70-70-22361710-2-20181217-0-0-1-0-0-4020-0-36200258-1-0-0-0-0">21.54 Britannia Way</a></div> 
     <div id="menuItem_5" class="Level2" >&#187; <a href="../coupon/?ptid=4020&amp;key=2-70-70-22361713-2-20181217-0-0-1-0-0-4020-0-36200261-1-0-0-0-0">21.57 Britannia Way</a></div> 
     <div id="menuItem_6" class="Level2" >&#187; <a href="../coupon/?ptid=4020&amp;key=2-70-70-22361716-2-20181217-0-0-1-0-0-4020-0-36200264-1-0-0-0-0">22.00 Britannia Way</a></div> 
     <div id="menuItem_7" class="Level2" >&#187; <a href="../coupon/?ptid=4020&amp;key=2-70-70-22361719-2-20181217-0-0-1-0-0-4020-0-36200267-1-0-0-0-0">22.03 Britannia Way</a></div> 
     <div id="menuItem_8" class="Level2" >&#187; <a href="../coupon/?ptid=4020&amp;key=2-70-70-22361722-2-20181217-0-0-1-0-0-4020-0-36200270-1-0-0-0-0">22.06 Britannia Way</a></div> 
     </div> 
    </div> 
</div> 

我使用的XPath是100%正確的,因爲它工作在同一個頁面上的瀏覽器,但這裏有一個例子a標籤,它是從先前顯示頁retreiving:

<a href="./coupon/?ptid=4020&amp;key=2-70-70-22361710-2-20181217-0-0-1-0-0-4020-0-36200258-1-0-0-0-0"">1.54 Britannia Way</</a> 

這裏是我複製從上面簡單的原文:

<a href="../coupon/?ptid=4020&amp;key=2-70-70-22361710-2-20181217-0-0-1-0-0-4020-0-36200258-1-0-0-0-0">21.54 Britannia Way</a></div> 

正如你可以發ee,InnerText發生了很大的變化,URL也有所變化。顯然我的程序不起作用,但我不知道如何。什麼會導致這種情況?它是HtmlAgilityPack中的錯誤嗎?請指教!謝謝閱讀!

回答

0

多小時猜測和調試後,這個問題竟然是一個HtmlDocument,我是重新使用。每次我想加載一個新頁面而不是使用同一個頁面時,我通過創建一個新的HtmlDocument來解決此問題。

我希望這可以節省你我失去的時間!

2

不要假設在您的瀏覽器中工作的XPath表達式(after DOM-conversion,可能使用AJAX加載數據,...)。這似乎是一個網站給予賭注引號,我想他們正在加載數據與一些JavaScript調用。

驗證您的XPath表達式是否頁面源代碼相匹配(如獲取使用wget或通過單擊「查看源代碼」在您的瀏覽器 - 不要使用Firebug/...這個

如果網站!使用AJAX加載數據時,您可能會使用Firebug監控在加載頁面時獲取的資源,通常這些是非常容易解析的JSON或XML文件,使用它們更容易解析一個可怕的HTML惡意網站

更新:在這種特殊情況下,網站轉發用戶不發送Accept-Language標題到語言選擇頁面。發送這樣的頭文件以接收與瀏覽器相同的內容。在嫋嫋,它應該是這樣的:

curl -H "Accept-Language: en-US;q=0.6,en;q=0.4" https://mobile.bet365.com/sport/splash/Default.aspx?Sport 
+0

嗨,感謝您的評論,但該網站並未使用AJAX加載數據。我上面顯示的HTML是我從響應中獲得的原始HTML,並且您可以看到由XPath表達式檢索到的HTML被損壞(某些數據丟失或添加)。 – TheGateKeeper

+0

如果您不提供所有相關信息:頁面URL,XPath表達式,我們無法進一步幫助您。無法複製的問題通常不會得到解決。 –

+0

URL是'https://mobile.bet365.com/sport/splash/Default.aspx?Sport = 2&key = 2&L = 1',然後點擊今天的比賽,XPath表達式是// // div [@id = 'subMenu_2'] // A'。即使表達不正確,它也不應該得到任何東西或獲得除我想要的之外的東西,不會得到我想要的東西,但使用不同的HTML。這可能是HTMLAGILITYPACK中的一個錯誤嗎?你可以嘗試重現它嗎? – TheGateKeeper