我在 Windows Store 中有一个简单的应用程序。此应用程序从网站下载并解析 HTML。我使用HttpClient 类
现在我遇到了一个大问题,因为页面看起来与特定国家不同,而且我的解析不成功。
示例:当来自美国的人使用我的应用程序时,应用程序会下载不同的 HTML 内容,因为网页在特定国家/地区看起来不同。
如何在 http 客户端中设置默认位置?我希望在所有执行中都有相同的 HTML。
编辑 我调用这个页面:LINK
我在 Windows Store 中有一个简单的应用程序。此应用程序从网站下载并解析 HTML。我使用HttpClient 类
现在我遇到了一个大问题,因为页面看起来与特定国家不同,而且我的解析不成功。
示例:当来自美国的人使用我的应用程序时,应用程序会下载不同的 HTML 内容,因为网页在特定国家/地区看起来不同。
如何在 http 客户端中设置默认位置?我希望在所有执行中都有相同的 HTML。
编辑 我调用这个页面:LINK
暂时忽略最初的问题
请不要为任何功能编写依赖于任何类型的 HTML 解析的应用程序。您所调用的所有站点所要做的就是在“错误”的地方更改一两个 ID,并且您的应用程序将对每个用户都失败,直到您发布更新为止。
回到答案
好的,假设屏幕抓取是您想要使用您的应用程序的方式,并且当然假设您正在抓取的网站在其使用条款中允许此类行为(检查 - 这对您来说不会很有趣如果您没有阅读它们会被起诉)那么我会建议一种稍微不同的方法。
既然您不能保证对于您的用户访问您的应用程序的任何语言环境都获得相同的页面布局,为什么不设置一个为您执行解析工作的 Web 服务,并从您的应用程序询问该服务,而不是直接访问该站点?
您的应用程序 <--> 您的网络服务 <--> 提供数据的站点
这样,您始终知道您返回的数据的格式是一致的,就好像针对特定语言环境(您的 Web 服务器)一样,然后您只需维护一段代码即可对其进行解析。只要底层数据结构发生变化,这就会简单得多(相信我,会有变化)
您需要在发出请求时设置默认语言标头和/或考虑将其设为用户可定义的设置。
暂时将设计缺陷考虑放在一边(您可能有或没有充分的理由进行屏幕抓取),以下是设置Accept-Language
标题的方法:
var httpClient = new HttpClient();
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, new Uri("http://www.livescore.com"));
httpRequestMessage.Headers.Add("Accept-Language", "en");
var response = await httpClient.SendAsync(httpRequestMessage);
string content = await response.Content.ReadAsStringAsync();
这个问题的答案取决于网站如何实现默认语言选择。根据特定站点的工作方式,其他两个答案都可能是正确的。
如果您可以共享站点 URL,我们可以告诉您使用合适的策略。
尝试始终使用cultureInfo 路径参数调用有问题的url,如果它有一个,例如说你的目标是microsoft.com,那么你会得到这样的东西:
等等。如果这适用于您,这将是一个想法。