【发布时间】:2020-05-26 15:24:16
【问题描述】:
我正在开发一个获取网页并逐行处理其内容的 C# 应用程序。为此,我使用HttpClient 类,并通过ReadAsStreamAsync() 读取页面内容。然后我将流读入一个线阵列并对其进行迭代。到目前为止一切顺利。
但是,我使用此方法获得的 HTML 与我使用 Chrome 或 Edge 导航到网页并使用查看源代码访问 HTML 时观察到的 HTML 不同。特别是,当我使用浏览器时,隐藏的 __VIEWSTATE 和 __VIEWSTATEGENERATOR input 元素被带有 class="aspNetHidden" 的 div 元素包围,但当我以编程方式获取 HTML 时则不然。这破坏了我的行跟踪逻辑,因为浏览器看到的页面中有与我在代码中获取的页面相关的额外行。
编辑。经过一些测试,我确信客户端使用的用户代理标头决定了是否提供 class="aspNetHidden" div。当我模仿浏览器的用户代理(“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.37")时,div送达;如果我使用“测试客户端”等其他代理,则不会提供div。
然后我的问题是,是否有任何文档说明哪些用户代理字符串导致div 被提供,哪些不提供?另外,我可以防止这种情况发生吗?
谢谢。
【问题讨论】:
-
可能有一个脚本会在加载 html 时执行并更改 html 内容。您在浏览器(查看源代码)上看到的 HTML 可能不必与您使用 HttpClient 阅读的 HTML 相匹配。
-
你是如何解析 html 的?如果您使用 Html Agility Pack 之类的内容,则行数无关紧要。
-
@VDWWD:我不是在解析 HTML,而是在做一些面向行的处理。
标签: c# html asp.net dotnet-httpclient