使用Async,HtmlAgilityPack和XPath進行解析

asynchronous c# html-agility-pack web-scraping xpath

我遇到了一個相當奇怪的問題。這很難解釋所以請耐心等待,但基本上這裡有一個簡短的介紹:

  • 我是Async編程的新手,但無法在我的代碼中找到問題
  • 我之前使用過HtmlAgilityPack,但從未使用過.NET 4.5版本。
  • 這是一個學習項目,我不是想要刮掉這樣的東西。

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

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

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

HTML正在被正確地檢索,但是XPath提取的HtmlNodes正在破壞他們的HTML。以下是我在Fiddler的回復中得到的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>

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

一般承認的答案

經過幾個小時的猜測和調試,問題變成了我重新使用的HtmlDocument 。每次我想加載新頁面而不是使用相同的頁面時,我通過創建一個新的HtmlDocument來解決問題。

我希望這能節省你丟失的時間!


熱門答案

不要假設XPath表達式在您的瀏覽器中工作( 在DOM轉換之後 ,可能使用AJAX加載數據,......)。這似乎是一個提供下注報價的網站,我猜他們正在加載一些javascript調用的數據。

驗證您的XPath表達式是否與頁面源代碼匹配(例如使用wget獲取或通過單擊瀏覽器中的“查看源代碼” - 不要使用Firebug / ...為此!

如果站點使用AJAX加載數據,您可以通過使用Firebug來監視在加載頁面時獲取的資源。通常這些是非常容易解析的JSON或XML文件,並且使用它們比解析可怕的HTML網站更容易。

更新:在此特殊情況下,站點會將未向Accept-Language標頭髮送的用戶轉發到語言選擇頁面。發送此類標頭以接收與瀏覽器相同的內容。在curl中,它看起來像這樣:

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow