【问题标题】:URL call with string keyword substitution使用字符串关键字替换的 URL 调用
【发布时间】:2014-09-13 23:57:03
【问题描述】:
import urllib2
from xml.dom import minidom

query = """http://phx01.companyA.com:8000/?query=kindle+fire&country_id=1&lang_id=1&linkin_id=8073631&sbh_id=120555,1&weight_group_id=80&request_id=p20.b6894b85df2f81d54003&brand_id
=14623&request_type=SRS&............."""    #multiple lines, a lot content omitted

response = urllib2.urlopen("".join(query.split('\n')))
dom = minidom.parse(response)

上面的示例查询通过了(我在上面的链接中用companyA 替换了真实的公司名称)。

现在如果我想用iphone5 替换kindle fire,怎么做? 我想我可以把它做成类似的东西

keyword = "iphone5"
"""...... query = %s.............""" %(keyword)

但它失败了,我怀疑它可能与关键字编码有关,但是这里怎么做呢?

【问题讨论】:

  • 作为旁注,为了避免有那么长的行并且仍然有正确的代码,您可以通过执行类似 query = """http://phx01.companyA.com:8000/""" + \ """?query=kindle+fire&country_id=1&""" + \ ...query = ("""http://phx01.companyA.com:8000/""" """?query=kindle+fire&country_id=1&""" ...) 的操作来拆分 query,并将每个项目放在单独的线。有关更多详细信息,请参阅paste

标签: python parsing url urllib2


【解决方案1】:

添加一个占位符{query} 并使用format() 填写:

import urllib

query = """http://phx01.companyA.com:8000/?query={query}&country_id=1&lang_id=1&linkin_id=8073631&sbh_id=120555,1&weight_group_id=80&request_id=p20.b6894b85df2f81d54003&brand_id=14623&request_type=SRS"""

value = "kindle fire"
query = query.format(query=urllib.quote_plus(value))

请注意,您需要使用urllib.quote_plus() 对值进行编码。它的作用如下:

>>> import urllib
>>> value = "kindle fire"
>>> urllib.quote_plus(value)
'kindle+fire'

或者,您可以制作一个查询参数字典,然后urlencode()它:

>>> import urllib
>>> value = "kindle fire"
>>> params = {'query': value, 'country_id': '1'}
>>> urllib.urlencode(params)
'query=kindle+fire&country_id=1'

你甚至可以使用urlparse解析url,使用parse_qsl()获取查询参数,设置合适的query参数值和urlencode()参数:

>>> url = """http://phx01.companyA.com:8000/?query=kindle+fire&country_id=1&lang_id=1&linkin_id=8073631&sbh_id=120555,1&weight_group_id=80&request_id=p20.b6894b85df2f81d54003"""
>>> params = urlparse.urlparse(url).query                                                                                                                     
>>> params = urlparse.parse_qsl(params)
>>> params
[('query', 'kindle fire'), ('country_id', '1'), ('lang_id', '1'), ('linkin_id', '8073631'), ('sbh_id', '120555,1'), ('weight_group_id', '80'), ('request_id', 'p20.b6894b85df2f81d54003')]
>>> params = dict(params)
>>> urllib.urlencode(params)  
'linkin_id=8073631&country_id=1&lang_id=1&weight_group_id=80&request_id=p20.b6894b85df2f81d54003&query=kindle+fire&sbh_id=120555%2C1'
>>> params['query'] = 'iphone'
>>> urllib.urlencode(params)
'linkin_id=8073631&country_id=1&lang_id=1&weight_group_id=80&request_id=p20.b6894b85df2f81d54003&query=iphone&sbh_id=120555%2C1'

【讨论】:

  • 非常感谢。我使用了 urllib.quote_plus(),它起作用了。
猜你喜欢
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2011-12-15
  • 2020-03-14
  • 2014-10-07
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多