2015-10-22 2 views
0

Существует список, содержащий URL адресов на с параметрами:извлечения параметров URL в панды DataFrame

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 

Я планировал использовать питон встроенного 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.

ответ

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 
3

Существует 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 
1

в качестве альтернативы, так как панды 0.18.0 (13 марта 2016), вы можете использовать метод pandas.Series.str.extractall() как:

params = df.url.str.extractall('[?&](?P<parameter>[^?#=]+)=?(?P<value>[^&]*)') 
print params 
Out[1]: 
     parameter value 
    match     
0 0  param1 apple 
    1  param2 tomato 
    2  param3 carrot 
1 0  param1 banana 
    1  param3 potato 
    2  param4 berry 
2 0  param2 apple 
    1  param3 tomato 
    2  param4 carrot 

Или что-то адаптировано из этого.

Было бы приятно иметь (лучший) доступ к регулярным выражениям, используемым в библиотеке urlparse, чтобы иметь возможность использовать их в этом методе и непосредственно pandas.Series.str.extract().

Наконец, не забудьте пометить Working with Text Data, у него есть куча полезных примеров.