2011-03-14 50 views
1

我环顾四周,发现了一些如何在python中分割文本但在我的示例中遇到问题的示例。这是我想分析的内容:解析HTML时遇到问题

<img alt="" src="http://example.com/servlet/charting?base_color=grey&amp;chart_width=288&amp;chart_height=160&amp;chart_type=png&amp;chart_style=manufund_pie&amp;3DSet=true&amp;chart_size=small&amp;leg_on=left&amp;static_xvalues=10.21,12.12,43.12,12.10,&amp;static_labels=blue,red,green,purple"> 

这里是我的尝试:

dict(kvpair.split('=') for kvpair in variableIwantToParse.split('&')) 

我得到的错误“ValueError异常:词典更新序列元素#0的长度为5;二是要求”

我也尝试使用variableIwantToParse.strip('&'),但是当我尝试打印variableIwantToParse时,它每次只移动一个字母。

我相信这很容易,但似乎无法弄清楚如何解析它。我基本上希望10.21,12.12,43.12,12.10与蓝色,红色,绿色,紫色(按显示的顺序)相关联

非常感谢您的帮助(如果这太容易了,非常抱歉......我可以对于我的生活找出命令来解析这个):-)

+0

这不是文字,而是HTML。标题和标签已调整。 – 2011-03-14 08:54:55

回答

7

使用内置的urlparse module,不要自己做这些分裂。

>>> import urlparse 
>>> url_to_parse = "http://example.com/servlet/charting?base_color=grey&amp;chart_width=288&amp;chart_height=160&amp;chart_type=png&amp;chart_style=manufund_pie&amp;3DSet=true&amp;chart_size=small&amp;leg_on=left&amp;static_xvalues=10.21,12.12,43.12,12.10,&amp;static_labels=blue,red,green,purple" 
>>> parsed_url = urlparse.urlparse(url_to_parse) 
>>> query_as_dict = urlparse.parse_qs(parsed_url.query) 
>>> print query_as_dict 
{'chart_size': ['small'], 'base_color': ['grey'], 'chart_style': ['manufund_pie'], 'chart_height': ['160'], 'static_xvalues': ['10.21,12.12,43.12,12.10,'], 'chart_width': ['288'], 'static_labels': ['blue,red,green,purple'], 'leg_on': ['left'], 'chart_type': ['png'], '3DSet': ['true']} 

如果您使用的Python版本低于2.6,那么您必须导入cgi module。做到这一点,而不是:

>>> import urlparse 
>>> import cgi 
>>> parsed_url = urlparse.urlparse(url_to_parse) 
>>> query_as_dict = cgi.parse_qs(parsed_url.query) 
>>> print query_as_dict 
{'chart_size': ['small'], 'base_color': ['grey'], 'chart_style': ['manufund_pie'], 'chart_height': ['160'], 'static_xvalues': ['10.21,12.12,43.12,12.10,'], 'chart_width': ['288'], 'static_labels': ['blue,red,green,purple'], 'leg_on': ['left'], 'chart_type': ['png'], '3DSet': ['true']} 

然后将它们关联到字典,使用所提供的字典构造一起zip

>>> print dict(zip(query_as_dict['static_labels'][0].split(','), query_as_dict['static_xvalues'][0].split(','))) 
{'blue': '10.21', 'purple': '12.10', 'green': '43.12', 'red': '12.12'} 
+0

非常感谢Mahmoud的快速响应。我试过这个,我得到了一个错误“AttributeError:'模块'对象没有属性'parse_qs'”我缺少一个模块的Python?或者它是一种类型?我很抱歉,我不知道这个命令足以试图找出应该去那里的东西。 – Lostsoul 2011-03-14 08:47:16

+0

你使用Python <2.6吗? – 2011-03-14 08:48:08

+0

不,对不起,我正在使用Jython 2.5.1我忘了提及。 – Lostsoul 2011-03-14 08:49:41

0

方括号:

dict([kvpair.split('=') for kvpair in variableIwantToParse.split('&')]) 

也与&安培替换&;有帮助。

0

这会得到你想要的东西:

d = dict(kv.split('=') for kv in string_to_parse.split('?')[1][:-2].split('&amp;')) 
labels_and_values = zip(d['static_labels'].split(','), d['static_xvalues'].split(',')) 

它可以是真正有用打破东西,在命令提示符下,当你遇到麻烦。例如:

10 > for kv in s.split('&'): 
...:  print kv.split('=') 

如果你看看你会看到分裂的&是造成你的问题(喂字典值过多的一个项目列表)。

相关问题