Je développe une application C # qui récupère les pages Web et traite leur contenu ligne par ligne. Pour ce faire, j'utilise la classe HttpClient
et je lis le contenu de la page via ReadAsStreamAsync()
. Ensuite, je lis le flux dans un tableau de lignes et je le répète. Jusqu'ici tout va bien.
Cependant, le HTML que j'obtiens avec cette méthode n'est pas identique au HTML que j'observe si je navigue vers la page Web en utilisant Chrome ou Edge et j'utilise Afficher la source pour accéder au HTML. Dans en particulier, les éléments __VIEWSTATE et __VIEWSTATEGENERATOR hidden input
sont entourés d'éléments div
avec class="aspNetHidden"
lorsque j'utilise le navigateur, mais pas lorsque j'obtiens le HTML par programmation. Cela ruine ma logique de suivi de ligne car il y a des lignes supplémentaires dans la page comme vu par le navigateur par rapport à la page que je reçois dans le code.
MODIFIER . Après quelques tests, je suis convaincu que l'en-tête de l'agent utilisateur utilisé par le client est ce qui détermine si le class="aspNetHidden"
div
est diffusé. Lorsque j'imite l'agent utilisateur de mon navigateur ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.37"), le div
est servi; si j'utilise un autre agent tel que "Test Client", le div
n'est pas servi.
Ma question est alors la suivante: existe-t-il une documentation sur les chaînes d'agent utilisateur qui provoquent le service div
et celles qui ne le sont pas? Puis-je éviter que cela ne se produise?
Merci.
Cela peut se produire pour plusieurs raisons, l'une des plus probables est celle qui @ thangadurai a mentionné There may be a script which gets executed onload of the html and changes the html content.
. Cela pourrait être évité en utilisant un cadre de test d'interface utilisateur tel que Selenium ou en utilisant headless Chrome par programmation.
L'une des autres raisons possibles est le User-Agent
implémentation dépendante. Cela peut être résolu simplement en changeant le User-Agent
entête.
EDIT: Si vous contrôlez la page Web, vous pourriez probablement désactiver ViewState si c'est le cas. Le comportement peut être basé sur la détection de User-Agent
capacités. Pour votre traitement, vous pouvez utiliser l'une ou l'autre des chaînes et la rendre statique lorsque vous envoyez la demande, même si elle peut ne pas être aussi fiable. Une autre méthode de traitement sans analyse pourrait être d'utiliser une expression régulière pour faire correspondre des balises spécifiques. Les spécificités de la décision sur le rendu de ViewState ont été bien décrites par @pfx ici .