用户代理字符串的解析器?

时间:2016-11-27 04:26:01

标签: python regex http parsing user-agent

我正在尝试解析用户代理字符串,并理想地将它们提取到Python字典中。在搜索网之后,似乎唯一的方法是从头开始编写正则表达式解析器。据我所知,迄今为止最好的解决方案是https://github.com/ua-parser的贡献者所做的事情。

现在,请考虑以下用户代理(UA)字符串:

Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

当我通过上面提到的ua-parser(在Python中)提供它时,我得到以下字典:

{   'device': {'brand': None, 'family': 'Other', 'model': None},
    'os': {   'family': 'Windows 7',
              'major': None,
              'minor': None,
              'patch': None,
              'patch_minor': None},
    'string': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko',
    'user_agent': {'family': 'IE', 'major': '11', 'minor': '0', 'patch': None}}

所以这是我的问题:为什么返回的user_agent字段说它的系列是IE 11,显然,在原始UA字符串中没有引用IE?第一个关键字,即Mozilla / 5.0发生了什么?为什么Windows NT 6.1被视为Windows 7系列?在我看来,输出字典与输入UA字符串几乎没有关系。尝试在以下在线解析器中提供UA字符串并亲自查看:

https://udger.com/resources/online-parser?Fuas=Mozilla%2F5.0+%28Windows+NT+6.1%3B+Trident%2F7.0%3B+rv%3A11.0%29+like+Gecko%0D%0A&Fip=&test=&action=analyze

我疯了还是这些解析器完全脱离了标记?

旁注:用户代理字符串遵循HTTP标准https://tools.ietf.org/html/rfc7231#section-5.5.3指定的明确定义的格式。因此,您认为解析它们是一件简单的事情,但似乎并非如此......

1 个答案:

答案 0 :(得分:0)

让我们分解每个参数并理解它:

Mozilla / 5.0 - 说明浏览器的常规令牌是Mozilla兼容的,现在几乎每个浏览器都会使用。

Windows NT 6.1 - 浏览器的平台。 Windows NT是Windows操作系统基于的内核。每个版本都是Windows的不同版本(请参阅here)。

Trident / 7.0 - 是IE使用的布局引擎。它分为 Engine_Name / Version

rv:11.0 - 浏览器版本。这里表示IE11。

像Gecko 一样 - 为了让网站为浏览器识别正确的CSS规则,他们会在User-Agent中搜索某个字符串。通过添加like Gecko网站知道IE能够处理Gecko模板化CSS规则。 您可以在MSDN上阅读有关IE用户代理的更多信息。