【问题标题】:Create a column with the domain name of each line from a URL in Python从 Python 中的 URL 创建一列,其中包含每行的域名
【发布时间】:2021-09-20 09:38:41
【问题描述】:

我从 Python 开始,在创建从 URL 列获取域名的新列时遇到问题。

谁能给我解释一下怎么做?

import pandas as pd

concu = pd.read_csv(r'/Desktop/Concu.csv')

df = pd.DataFrame(concu, columns= ['URL'])

#df3['Domain'] = #GET THE DOMAIN NAME (NO HTTP/HTTPS/WWW. AND without everything 
after .com, .io...)

print(df)




                                                   URL
0     https://smartkeyword.io/seo-outils-google-util...
1     https://smartkeyword.io/referencement-naturel-...
2     https://smartkeyword.io/seo-on-page-urls-optim...
3     https://smartkeyword.io/seo-outils-google-util...
4     https://smartkeyword.io/seo-outils-google-cach...
...                                                 ...
6758           https://www.primelis.com/consultant-seo/
6759       https://www.primelis.com/expertises/seo/aso/
6760  https://www.primelis.com/labo/consideration-li...
6761  https://www.primelis.com/faq/fonctionnement-re...
6762  https://www.primelis.com/blog/comment-est-ne-l...

[6763 rows x 1 columns]

非常感谢!

【问题讨论】:

    标签: python regex pandas dataframe


    【解决方案1】:

    您可以尝试提取/// 之间的任何内容,www. 是可选的,然后取第二组。

    >>> df['URL'].str.extract('//(www\.){0,1}(.*?)/')[1]
    
    0       smartkeyword.io
    1       smartkeyword.io
    2       smartkeyword.io
    3       smartkeyword.io
    4       smartkeyword.io
    6758       primelis.com
    6759       primelis.com
    6760       primelis.com
    6761       primelis.com
    6762       primelis.com
    Name: 1, dtype: object
    

    如评论中所问,如果您不想使用组捕获,您可以使用 (?...)? 查找出现的 www. 的零次或精确一次并提取域。

    >>> df['URL'].str.extract('//(?:www\.)?(.*?)/')
    
                        0
    0     smartkeyword.io
    1     smartkeyword.io
    2     smartkeyword.io
    3     smartkeyword.io
    4     smartkeyword.io
    6758     primelis.com
    6759     primelis.com
    6760     primelis.com
    6761     primelis.com
    6762     primelis.com
    

    注意:?: 表示子模式是非捕获子模式。这意味着在(?:www\.) 中匹配的任何内容,即使它被() 包围,它也不会出现在匹配列表中,只有(.*?) 会出现。

    由于您在评论中提到也有子域,如果有,请尝试以下操作:

    df['URL'].str.extract('//(?:\w+\.)?(.*?\..*?)/')
    

    上面的正则表达式将只捕获所需的文本,跳过www. 或任何其他子域。

    【讨论】:

    • 有没有一种方法可以将www 分组(正如您所做的那样)并且我们不会在结果中得到它(以避免神秘的[1])?
    • 谢谢!!我为不知道?:的人添加了描述
    • 我没有在我的问题中指定这一点,但我还需要删除最终的子域(en.example.comes.example.comexample.com 应该返回相同的结果)。我怎样才能做到这一点? @ThePyGuy
    • @LuchoSEO,我也为子域添加了这一点
    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2022-07-20
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多