解析HTML时遇到问题

1 投票
3 回答
1902 浏览
提问于 2025-04-16 13:38

我在网上找了一些关于如何在Python中分割文本的例子,但在我的例子中遇到了问题。以下是我想要解析的内容:

<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: dictionary update sequence element #0 has length 5; 2 is required”,意思是说在更新字典的时候,某个元素的长度不对。

我还试着用variableIwantToParse.strip('&'),但是当我打印variableIwantToParse的时候,它只显示了一个字母。

我知道这应该很简单,但就是搞不清楚怎么解析。我基本上想把10.21,12.12,43.12,12.10和blue,red,green,purple(按显示的顺序)关联起来。

非常感谢你的帮助(如果这个问题太简单了我很抱歉……我就是想不出怎么解析这个命令):-)

3 个回答

0

方括号:

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

另外,把 & 替换成 &amp; 也可能有帮助。

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('=')

如果你仔细查看一下,就会发现用 & 来分割数据是导致你出问题的原因(给列表中的一个项目传入了太多的值)。

7

使用内置的 urlparse模块,不要自己去拆分这些内容。

>>> 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模块。可以这样做:

>>> 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'}

撰写回答