从 pandas 列中提取 urls 信息
Extract urls information from pandas column
我需要保留 link:
的某些部分
Link
www.xxx.co.uk/path1
www.asx_win.com/path2
www.asdfe.aer.com
...
期望的输出:
Link2
xxx.co.uk
asx_win.com
asdfe.aer.com
...
我用了 urlparse
和 tldextract
但我得到了其中一个
Netloc
www.xxx.co.uk
www.asx_win.com
www.asdfe.aer.com
...
或
TLDEXTRACT
xxx
asx_win
asdfe.aer
...
通过使用字符串,一些问题可能来自以下方面:
9 https://www.facebook.com/login/?next=https%3A%...
10 https://pt-br.facebook.com/114546123419/pos...
11 https://www.facebook.com/login/?next=https%3A%...
20 http://fsareq.media/?pg=article&id=s...
22 https://www.wq-wq.com/lrq-rqwrq-...
24 https://faseqrq.it/2020/05/28/...
我的尝试是考虑我从 url parse (Netloc) 和 tldextract(即结尾部分)得到的差异。
例如,从 Netloc 我得到 www.xxx.co.uk
,从 tldextract 我得到 xxx
。这意味着如果我从 Netloc 中减去 tldextract,我会得到 www
和 co.uk
。我会使用公共部分作为截止点并保留之后的部分(即 .co.uk
),这就是我要寻找的。
差异将由 df['Link2'] = [a.replace(b, '').strip() for a, b in zip(df['Netloc'], df['TLDEXTRACT'])]
之类的东西给出。这仅适用于我需要考虑的结尾部分(后缀)。
现在我需要了解如何只考虑结尾部分以获得预期的输出。您可以在上面的示例中使用列 Netloc 和 TLDEXTRACT。
首先删除 http / https:
from urllib.parse import urlparse
def remove(row):
if(row['urls'].str.contains('https') or row['urls'].str.contains('http')):
return urlparse(row['urls']).netloc
withouthttp = df.apply(lambda x: remove(x), axis=1)
然后 :
删除前 4 个符号(“www.”)
删除 (/) 之后的所有内容
df = pd.DataFrame({'urls': ['www.xxx.co.uk/path1', 'www.asx_win.com/path2', 'www.asdfe.aer.com']})
df['urls'] = df['urls'].str[4:]
df['urls'].str.split('/').str[0]
您还可以使用 https 和 http 编辑所有记录:
onlyHttps = df.loc[df['urls'].str.contains("https", case=False)]
allWithoutHttps = df[~df["urls"].str.contains("https", case=False)]
并且在所有操作之后(删除 www 并删除 http/https - 连接正确的记录)
pd.concat([https, http, www])
tldextract.extract()
returns (subdomain, domain, suffix)
:
的命名元组
tldextract.extract('www.xxx.co.uk')
# ExtractResult(subdomain='www', domain='xxx', suffix='co.uk')
所以你可以只加入索引 [1:]
:
import tldextract
df['Extracted'] = df.Link.apply(lambda x: '.'.join(tldextract.extract(x)[1:]))
# Link Extracted
# 0 www.xxx.co.uk/path1 xxx.co.uk
# 1 www.asx_win.com/path2 asx_win.com
# 2 www.asdfe.aer.com aer.com
# 3 https://www.facebook.com/login/?next=https%3A%... facebook.com
# 4 https://pt-br.facebook.com/114546123419/pos... facebook.com
# 5 https://www.facebook.com/login/?next=https%3A%... facebook.com
# 6 http://fsareq.media/?pg=article&id=s... fsareq.media
# 7 https://www.wq-wq.com/lrq-rqwrq-... wq-wq.com
# 8 https://faseqrq.it/2020/05/28/... faseqrq.it
我需要保留 link:
的某些部分Link
www.xxx.co.uk/path1
www.asx_win.com/path2
www.asdfe.aer.com
...
期望的输出:
Link2
xxx.co.uk
asx_win.com
asdfe.aer.com
...
我用了 urlparse
和 tldextract
但我得到了其中一个
Netloc
www.xxx.co.uk
www.asx_win.com
www.asdfe.aer.com
...
或
TLDEXTRACT
xxx
asx_win
asdfe.aer
...
通过使用字符串,一些问题可能来自以下方面:
9 https://www.facebook.com/login/?next=https%3A%...
10 https://pt-br.facebook.com/114546123419/pos...
11 https://www.facebook.com/login/?next=https%3A%...
20 http://fsareq.media/?pg=article&id=s...
22 https://www.wq-wq.com/lrq-rqwrq-...
24 https://faseqrq.it/2020/05/28/...
我的尝试是考虑我从 url parse (Netloc) 和 tldextract(即结尾部分)得到的差异。
例如,从 Netloc 我得到 www.xxx.co.uk
,从 tldextract 我得到 xxx
。这意味着如果我从 Netloc 中减去 tldextract,我会得到 www
和 co.uk
。我会使用公共部分作为截止点并保留之后的部分(即 .co.uk
),这就是我要寻找的。
差异将由 df['Link2'] = [a.replace(b, '').strip() for a, b in zip(df['Netloc'], df['TLDEXTRACT'])]
之类的东西给出。这仅适用于我需要考虑的结尾部分(后缀)。
现在我需要了解如何只考虑结尾部分以获得预期的输出。您可以在上面的示例中使用列 Netloc 和 TLDEXTRACT。
首先删除 http / https:
from urllib.parse import urlparse
def remove(row):
if(row['urls'].str.contains('https') or row['urls'].str.contains('http')):
return urlparse(row['urls']).netloc
withouthttp = df.apply(lambda x: remove(x), axis=1)
然后 :
删除前 4 个符号(“www.”)
删除 (/) 之后的所有内容
df = pd.DataFrame({'urls': ['www.xxx.co.uk/path1', 'www.asx_win.com/path2', 'www.asdfe.aer.com']})
df['urls'] = df['urls'].str[4:]
df['urls'].str.split('/').str[0]
您还可以使用 https 和 http 编辑所有记录:
onlyHttps = df.loc[df['urls'].str.contains("https", case=False)]
allWithoutHttps = df[~df["urls"].str.contains("https", case=False)]
并且在所有操作之后(删除 www 并删除 http/https - 连接正确的记录)
pd.concat([https, http, www])
tldextract.extract()
returns (subdomain, domain, suffix)
:
tldextract.extract('www.xxx.co.uk')
# ExtractResult(subdomain='www', domain='xxx', suffix='co.uk')
所以你可以只加入索引 [1:]
:
import tldextract
df['Extracted'] = df.Link.apply(lambda x: '.'.join(tldextract.extract(x)[1:]))
# Link Extracted
# 0 www.xxx.co.uk/path1 xxx.co.uk
# 1 www.asx_win.com/path2 asx_win.com
# 2 www.asdfe.aer.com aer.com
# 3 https://www.facebook.com/login/?next=https%3A%... facebook.com
# 4 https://pt-br.facebook.com/114546123419/pos... facebook.com
# 5 https://www.facebook.com/login/?next=https%3A%... facebook.com
# 6 http://fsareq.media/?pg=article&id=s... fsareq.media
# 7 https://www.wq-wq.com/lrq-rqwrq-... wq-wq.com
# 8 https://faseqrq.it/2020/05/28/... faseqrq.it