1

有一个包含带有参数的 URL 地址的列表:

http://example.com/?param1=apple&param2=tomato&param3=carrot
http://sample.com/?param1=banana&param3=potato&param4=berry
http://example.org/?param2=apple&param3=tomato&param4=carrot

每个 URL 可能包含 4 个参数中的任何一个。

我想提取 URL 参数并将它们添加到 Pandas DataFrame 中。DataFrame 应该有一个 URL 列和 4 个带参数的列。如果 URL 中不存在参数,则单元格为空:

URL    param1    param2     param3    param4
...    apple     tomato     carrot
...    banana               potato    berry
...              apple      tomato    carrot

我打算使用 python 内置的urlparse模块,它可以轻松提取参数:

import urlparse
url = 'http://example.com/?param1=apple&param2=tomato&param3=carrot'
par = urlparse.parse_qs(urlparse.urlparse(url).query)
print par['param1'], par['param2']

Out: ['apple'] ['tomato']

使用urlparse我可以获取 URL 中的参数列表:

import pandas as pd

urls = ['http://example.com/?param1=apple&param2=tomato&param3=carrot',
        'http://sample.com/?param1=banana&param3=potato&param4=berry',
        'http://example.org/?param2=apple&param3=tomato&param4=carrot']

df = pd.DataFrame(urls, columns=['url'])
params = [urlparse.parse_qs(urlparse.urlparse(url).query) for url in urls]
print params

Out: [{'param1': ['apple'], 'param2': ['tomato'], 'param3': ['carrot']},
      {'param1': ['banana'], 'param3': ['potato'], 'param4': ['berry']},
      {'param2': ['apple'], 'param3': ['tomato'], 'param4': ['carrot']}]
...

我不知道如何将提取的参数添加到 DataFrame 中。也许有更好的方法来做到这一点?原始文件是~1m URL。

4

3 回答 3

4

我会推荐一个urlparse库,这种方法的好处是您不需要提前知道查询的字段名称('param1'等):

In [278]:

import urlparse
In [279]:

T = ['http://example.com/?param1=apple&param2=tomato&param3=carrot',
     'http://sample.com/?param1=banana&param3=potato&param4=berry',
     'http://example.org/?param2=apple&param3=tomato&param4=carrot']
In [280]:

df = pd.concat(map(lambda x: pd.DataFrame(urlparse.parse_qs(urlparse.urlparse(x).query)), T))
print df
#df['URL'] = T : add another column with the original URL's
   param1  param2  param3  param4
0   apple  tomato  carrot     NaN
0  banana     NaN  potato   berry
0     NaN   apple  tomato  carrot
于 2015-10-22T19:00:33.813 回答
3

或者,由于 pandas 0.18.0(2016 年 3 月 13 日),您可以使用该pandas.Series.str.extractall()方法:

params = df.url.str.extractall('[?&](?P<parameter>[^?#=]+)=?(?P<value>[^&]*)')
print params
输出[1]:
        参数值
  匹配                  
0 0 参数 1 苹果
  1个参数2番茄
  2 参数 3 胡萝卜
1 0 参数 1 香蕉
  1 参数 3 马铃薯
  2 参数 4 浆果
2 0 参数 2 苹果
  1个参数3番茄
  2 参数 4 胡萝卜

或者从那改编而来的东西。

如果能够(更好地)访问 urlparse 库中使用的正则表达式,以便能够在此方法中pandas.Series.str.extract()直接使用它们,那就太好了。

最后,一定要收藏使用文本数据,它有一堆有用的例子。

于 2016-11-28T02:07:11.370 回答
1

您可以使用字典理解来提取每个参数的参数中的数据。我不确定您是否想要列表形式的最终值。如果没有,很容易提取它。

>>> pd.DataFrame({p: [d.get(p) for d in params] 
                  for p in ['param1', 'param2', 'param3', 'param4']})
     param1    param2    param3    param4
0   [apple]  [tomato]  [carrot]      None
1  [banana]      None  [potato]   [berry]
2      None   [apple]  [tomato]  [carrot]

或者...

>>> pd.DataFrame({p: [d[p][0] if p in d else None for d in params] 
                  for p in ['param1', 'param2', 'param3', 'param4']})
   param1  param2  param3  param4
0   apple  tomato  carrot    None
1  banana    None  potato   berry
2    None   apple  tomato  carrot
于 2015-10-22T18:59:08.293 回答