【问题标题】:parsing a url in python with changing part in it在 python 中解析一个 url 并在其中更改部分
【发布时间】:2016-01-17 04:03:36
【问题描述】:

我正在用 Python 解析一个 url,您可以在下面找到一个示例 url 和代码,我想做的是从 url 中拆分 (74743) 并创建一个 for 循环,该循环将从一个部分中获取它列表。 尝试使用 urlparse 但无法完成它,主要是因为 url 中的部分发生了变化。我只想要最简单、最快捷的方法。

示例网址:

http://example.com/wps/portal/lYuxDoIwGAYf6f9aqKSjMNQ/?PartNo=74743&IntNumberOf=&is=

(http://example.com/wps/portal) 始终固定

(lYuxDoIwGAYf6f9aqKSjMNQ) 一直在变化

(74743) 将从列表名称 Parts 中获取

(IntNumberOf=&is=) 也根据部分而变化 网站

代码如下:

from lxml import html
import requests
import urlparse


Parts = [74743, 85731, 93021]

url = 'http://example.com/wps/portal/lYuxDoIwGAYf6f9aqKSjMNQ/?PartNo=74743&IntNumberOf=&is='

parsing = urlparse.urlsplit(url)

print parsing

【问题讨论】:

  • 你有什么办法不能“完成到最后”?
  • 只想忽略 url 的变化部分,并从 Parts 中获取 no.(74743) 。
  • 是的,但是你为什么不能完成呢?

标签: python parsing url split urlparse


【解决方案1】:
>>> import urlparse

>>> url = 'http://example.com/wps/portal/lYuxDoIwGAYf6f9aqKSjMNQ/?PartNo=74743&IntNumberOf=&is='

>>> split_url = urlparse.urlsplit(url)
>>> split_url.path
'/wps/portal/lYuxDoIwGAYf6f9aqKSjMNQ/'

您可以使用“/”将路径拆分为字符串列表,对列表进行切片,然后重新加入:

>>> path = split_url.path
>>> path.split('/')
['', 'wps', 'portal', 'lYuxDoIwGAYf6f9aqKSjMNQ', '']

切掉最后两个:

>>> path.split('/')[:-2]
['', 'wps', 'portal']

然后重新加入:

>>> '/'.join(path.split('/')[:-2])
'/wps/portal'

要解析查询,请使用 parse_qs:

>>> parsed_query = urlparse.parse_qs(split_url.query)
{'PartNo': ['74743']}

要保留空参数,请使用keep_blank_values=True:

>>> query = urlparse.parse_qs(split_url.query, keep_blank_values=True)
>>> query
{'PartNo': ['74743'], 'is': [''], 'IntNumberOf': ['']}

然后您可以修改查询字典:

>>> query['PartNo'] = 85731

并更新原来的split_url:

>>> updated = split_url._replace(path='/'.join(base_path.split('/')[:-2] +
                                              ['ASDFZXCVQWER', '']),
                                query=urllib.urlencode(query, doseq=True))

>>> urlparse.urlunsplit(updated)
'http://example.com/wps/portal/ASDFZXCVQWER/?PartNo=85731&IntNumberOf=&is='

【讨论】:

  • 对于 base_path,如果我有两个以上的 '/' ... 比如( /wps/portal/ut/p/c1/lYuxDoIwGAYf6f9aqKSjMNQ/ ,我该如何处理呢?
  • @T.M 什么网址?你试过代码吗?如果您还有其他问题,请提出新问题。首先阅读how to ask,尤其是关于如何创建Minimal, Complete, Verifiable Example 的部分。
  • 对不起,我的电脑卡住了.. 谢谢,感谢.. 但是对于 base_path,这个 url:'url = 'example.com/wps/portal/!ut/p/c1/…' 它什么也没给我,它给了我一个错误(更新)“无效的语法”
  • 抱歉,我不假思索地使用了 os.path.basename。我已经用 str.split 替换了一个示例。
  • 感谢第一部分效果很好,但“更新”给我一个 Traceback ... Traceback(最近一次调用最后):文件“solving_url_issue2.py”,第 41 行,在 中更新 = split_url._update(path='/'.join(base_path.split('/')[:-2] + AttributeError: 'SplitResult' object has no attribute '_update'....试图找到解决方案但是没找到..
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多