提取多个URL-Python

时间:2018-07-16 09:10:11

标签: python python-3.x pandas dataframe

我想从文本(注释)中提取几个链接,这些链接存储在熊猫数据框中。我的目标是将提取的URL添加到原始数据集的新列中。通过使用以下应用于文本的方法,我可以提取注释并将其存储在变量URL中,然后将其转换为另一个pandas数据框。在这种情况下,我不确定这是否是提取必要信息的有效方法。

URL = (ALL.textOriginal.str.extractall("(?P<URL>(https?://(?:www)?(?:[\w-]{2,255}(?:\.\w{2,6}){1,2})(?:/[\w&%?#-]{1,300})))").reset_index('match', drop=True))

URL_df = pd.DataFrame(data=URL)
URL_df.drop([1],axis=1)

gives me:

596    https://www.tag24.de/nachrichten
596    http://www.tt.com/panorama 
596    http://www.wz.de/lokales
666    https://www.svz.de/regionales
666    https://www.watson.ch/Leben
...    ...

数据框仅包含索引和超链接。这种方法的问题是,由于一个注释可以存在多个URL(将被提取),因此某些索引是重复的。我尝试了其他方法来解决此问题,例如:

pd.concat([ALL, URL_df.drop], axis=1).sort_index()

我还尝试通过应用以下方法将URL直接存储到原始数据帧中:

ALL['URL'] = ALL.textOriginal.str.extractall("(?P<URL>(https?://(?:www)?(?:[\w-]{2,255}(?:\.\w{2,6}){1,2})(?:/[\w&%?#-]{1,300})))").reset_index('match', drop=True))

但是我只收到以下错误消息:

  

“插入列的索引与框架索引不兼容”

正如我之前所说,我的目标是将提取的URL存储在新列中,例如:

text                             URL
"blablabla link1, link2, link3"  [https://www.tag24.de/nachrichten, http://www.tt.com/panorama, http://www.wz.de/lokales]
"blablabla link1, link2"         [https://www.svz.de/regionales, https://www.watson.ch/Leben]
...    ...

2 个答案:

答案 0 :(得分:2)

我认为需要findall

pat = "(https?://(?:www)?(?:[\w-]{2,255}(?:\.\w{2,6}){1,2})(?:/[\w&%?#-]{1,300}))"
ALL['URL'] = ALL.textOriginal.str.findall(pat)
print (ALL)
                                        textOriginal  \
0  https://www.tag24.de/nachrichten http://www.tt...   
1  https://www.svz.de/regionales https://www.wats...   

                                                 URL  
0  [https://www.tag24.de/nachrichten, http://www....  
1  [https://www.svz.de/regionales, https://www.wa...  ]

另一种使用extractall的解决方案,该解决方案在创建MultiIndex的第一级上返回groupby,因此很必要list

pat = "(https?://(?:www)?(?:[\w-]{2,255}(?:\.\w{2,6}){1,2})(?:/[\w&%?#-]{1,300}))"

ALL['URL']  = ALL.textOriginal.str.extractall(pat).groupby(level=0)[0].apply(list)
print (ALL)
                                        textOriginal  \
0  https://www.tag24.de/nachrichten http://www.tt...   
1  https://www.svz.de/regionales https://www.wats...   

                                                 URL  
0  [https://www.tag24.de/nachrichten, http://www....  
1  [https://www.svz.de/regionales, https://www.wa...  

设置

ALL = pd.DataFrame({'textOriginal': ['https://www.tag24.de/nachrichten http://www.tt.com/panorama http://www.wz.de/lokales', 'https://www.svz.de/regionales https://www.watson.ch/Leben']})

答案 1 :(得分:1)

比方说,您有一个包含两列的数据框,分别为“ Indice”和“ Link”,其中Indice不是唯一的。您可以通过以下方式将所有链接与相同的Indice聚合:

myAggregateDF = myDF.groupby('Indice')['Link'].apply(list).to_frame()

通过这种方式,您将获得一个新数据框,其中包含两列“ Indice”和“ Link”,其中“ Link”是先前链接的列表。

请注意,此方法效率不高。 Groupby占用大量内存,这对于大数据帧可能是个问题。