Analyse avec Async, HtmlAgilityPack et XPath

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

Question

J'ai rencontré un problème plutôt étrange. C'est très difficile à expliquer, alors s'il vous plaît supportez-moi, mais voici une brève introduction:

  • Je suis nouveau dans la programmation Async mais je n'ai pas pu localiser un problème dans mon code
  • J'ai déjà utilisé HtmlAgilityPack, mais jamais la version .NET 4.5.
  • C'est un projet d'apprentissage, je n'essaie pas de gratter ou quelque chose comme ça.

En gros, voici ce qui se passe: je récupère une page sur Internet, je la charge par flux dans un document HtmlDocument , puis HtmlNodes récupère certains HtmlNodes à l’aide d’expressions XPath . Voici un morceau de code simplifié:

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

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

Le code HTML est correctement restitué, mais les codes HTML extraits par XPath sont endommagés. Voici un exemple de code HTML que j'ai obtenu dans une réponse de Fiddler:

                    <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>

Le XPath J'utilise est 100% correct , car il fonctionne dans le navigateur sur la même page, mais voici un exemple d' a étiquette dont il est retreiving de la page présentée précédemment:

<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>

Et voici l'original que j'ai copié d'en haut pour la simplicité:

<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>

Comme vous pouvez le constater, InnerText a considérablement changé, de même que l'URL. Évidemment, mon programme ne fonctionne pas, mais je ne sais pas comment. Qu'est-ce qui peut causer ça? Est-ce un bug dans HtmlAgilityPack? S'il vous plaît donnez votre avis! Merci d'avoir lu!

Réponse acceptée

Après de nombreuses heures de recherche et de débogage, le problème s'est avéré être un document HtmlDocument que je réutilisais. J'ai résolu le problème en créant un nouveau document HtmlDocument chaque fois que je voulais charger une nouvelle page, au lieu d'utiliser la même.

J'espère que cela vous fait gagner du temps que j'ai perdu!


Réponse populaire

Ne présumez pas qu'une expression XPath fonctionne dans votre navigateur ( après la conversion DOM , éventuellement avec le chargement de données avec AJAX, ...). Cela semble être un site qui donne des cotes de pari. Je suppose qu’ils chargent les données avec des appels javascript.

Vérifiez si votre expression XPath correspond au code source des pages (par exemple, récupéré à l'aide de wget ou en cliquant sur "Afficher le code source" dans votre navigateur. N'utilisez pas Firebug / ... pour cela!

Si le site utilise AJAX pour charger les données, vous aurez peut-être de la chance en utilisant Firebug pour surveiller les ressources extraites pendant le chargement de la page. Il s’agit souvent de fichiers JSON ou XML très faciles à analyser, et il est encore plus simple de les utiliser que d’analyser un site Web contenant d’horribles problèmes de langage HTML.

Mise à jour: dans ce cas particulier, le site transfère les utilisateurs qui n'envoient pas d'en Accept-Language tête Accept-Language à une page de sélection de langue. Envoyez un tel en-tête pour recevoir le même contenu que le navigateur. En curl, cela ressemblerait à ceci:

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow