运行Useragent解析时结果不同

时间:2019-03-25 21:01:14

标签: python parsing

我正在使用httpagentparser库来剖析用户代理。但是,在相同输入上运行相同命令时,无论出于何种原因,我得到的排序结果都不同。

------ Construction foobar ------
   foo-1 Constructor
   foo-2 Move constructor
   foo-1 Destructor
------ Construction superman ------
   superman-1 Constructor
   superman-2 Move constructor
   superman-1 Destructor
------ Show the vector ------
   foo-2
   superman-2
------ Bye ------
   foo-2 Destructor
   superman-2 Destructor
user_agent_e="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"

python3.5 -c "import httpagentparser; s='$user_agent_e'; print (httpagentparser.detect(s))"
{'browser': {'name': 'Chrome', 'version': '73.0.3683.86'}, 'bot': False, 'platform': {'name': 'Windows', 'version': '10'}, 'os': {'name': 'Windows', 'version': '10'}}

仅使用这种单线纸如何获得可预测的结果?

4 个答案:

答案 0 :(得分:0)

这些都是一样的。

>>> a={'bot': False, 'os': {'version': '10', 'name': 'Windows'}, 'browser': {'version': '73.0.3683.86', 'name': 'Chrome'}, 'platform': {'version': '10', 'name': 'Windows'}}
>>> b={'platform': {'version': '10', 'name': 'Windows'}, 'bot': False, 'browser': {'version': '73.0.3683.86', 'name': 'Chrome'}, 'os': {'version': '10', 'name': 'Windows'}}
>>> c={'browser': {'name': 'Chrome', 'version': '73.0.3683.86'}, 'bot': False, 'os': {'name': 'Windows', 'version': '10'}, 'platform': {'name': 'Windows', 'version': '10'}}
>>> d={'bot': False, 'os': {'version': '10', 'name': 'Windows'}, 'browser': {'version': '73.0.3683.86', 'name': 'Chrome'}, 'platform': {'version': '10', 'name': 'Windows'}}
>>> e={'platform': {'version': '10', 'name': 'Windows'}, 'os': {'version': '10', 'name': 'Windows'}, 'bot': False, 'browser': {'version': '73.0.3683.86', 'name': 'Chrome'}}
>>> a==b==c==d==e
True

这些是词典。字典未排序,因此键-值对的打印顺序是随机的。仍然一样。

答案 1 :(得分:0)

原因是字典没有明确定义的顺序。您可以在已排序的字典上使用OrderedDict(有顺序):

python3 -c "from collections import OrderedDict; import httpagentparser; s='$user_agent_e'; print (OrderedDict(sorted(httpagentparser.detect(s).items())))"

或展开:

from collections import OrderedDict
import httpagentparser; s='$user_agent_e'
print(OrderedDict(sorted(httpagentparser.detect(s).items())))

答案 2 :(得分:0)

在3.6以下的Python3版本中,字典未排序。

如果希望所有词典都保留插入顺序,则可以使用CPython 3.6或更高版本。否则,您可以将httpagentparser的输出转换为列表:

python3.5 -c "import httpagentparser; s='$user_agent_e'; print (list(map(list, httpagentparser.detect(s).items())))"

这不需要任何其他导入。

答案 3 :(得分:0)

键的顺序可以不同,例如哈希函数是基于随机的。不知道它在3.5中的特殊情况,但是我会说-这就是原因。

要获得所需的内容,我将使用json,并使用已排序的键。

python3.5 -c "import httpagentparser; import json; s='$user_agent_e'; json.dumps(httpagentparser.detect(s), sort_keys=True)"