【问题标题】:How to differentiate domain addreses with urls by using the regex?如何使用正则表达式区分域地址和 url?
【发布时间】:2017-08-02 06:42:21
【问题描述】:

问题:

我正在开发一个提要生成器,它从各种在线资源收集提要,我需要将它们划分为域、url 和 ip 地址。根据我的逻辑,我可以将它们区分为 ips 和 rest。并应用正则表达式剩下的我想将它们区分为域和 url,但所有都将进入域列表而不是 url。

代码

#!/usr/bin/python
import csv
import MySQLdb
import time
from shutil import copyfile
import socket
import re

def __init__(self):
                self.data = ''
                self.ip = []
                self.url = []
                self.domain = []
def parse(self):
                with open('something.csv') as csv_file:
                        self.count = 0
                        self.reader = csv.reader( csv_file , delimiter = ',')
                        print self.reader.next()
                        self.data = self.reader

                        for trail in self.data:
                                self.address = trail[0]
                                try:
                                        socket.inet_aton( self.address )
                                        self.ip.append( self.address )
                                except:
                                        try:
                                                m = re.search(r"[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*" , trail[0] )
                                                print m.group()

                                                self.domain.append( self.address)
                                        except:
                                                self.url.append( self.address )
                                self.count +=1

                self.today_date = time.strftime( "%Y-%m-%d" )
                with open('/home//ip/{}'.format(self.today_date) , 'w') as g:
                        for i in self.ip:
                                g.write( i )
                                g.write( '\n')

我尝试了什么

  • 为了区分 ip 地址,我使用了 socket 库并使用了 socket.inet_aton 方法来验证它是否是有效的 ip,如果它是有效的 ip 地址,那么我将附加到列表中。
  • 我从正则表达式教程中获得了一些帮助,并编写了正则表达式来区分域

我想要的解决方案(已编辑) 问错了。我想要的是从 urls http://www.pcwebopedia.com/index.html 中提取域名并找到 domain_name 为 pcwebopedia.com 并将其发送到域列表并将完整的 url 发送到 url_list。

假设项目是 www.google.com 它应该将 google.com 发送到域列表并将 www.google.com 发送到 url 列表。

假设项目是 abc.net 它应该发送到域列表而不是 url 列表。

关于如何解决这个问题的任何建议?

【问题讨论】:

  • 如果您的示例涵盖所有情况,为什么不直接检查if '/' in self.address: ...
  • 您想如何处理“google.com/”之类的内容?顺便说一句,如果你想解析这些 URL,你应该看看urllib.parse,或urlparse for Python 2。这比使用正则表达式滚动你自己的解析器更好。
  • 我刚刚注意到您的问题被标记为 Python 2,但您正在以文本模式打开 CSV 文件。您可以在 Python 3 中安全地执行此操作,但在 Python 2 中,csv 模块需要以二进制模式打开文件,如 the docs 中所述。在 *nix 系统上使用文本文件不会有什么坏处,但在文本文件有 EOL 翻译的 Windows 上,它会弄得一团糟。

标签: python regex python-2.7 sockets csv


【解决方案1】:

最简单的解决方案是检查 url 中是否有 '/':

如果您想要更通用和有效的解决方案,请使用:

from urllib.parse import urlparse
urls = []
domains = []

def url_categorize(url):
    o = urlparse(url)
    if o.path:
        urls.append(url)
    else:
        domains.append(url)

url_categorize("https://www.google.co.in")
url_categorize("http://example.com")
url_categorize("https://stackoverflow.com/questions/ask")
url_categorize("https://twitter.com/MarceloRivero")


In [36]: urls
Out[36]: ['stackoverflow.com/questions/ask', 'twitter.com/MarceloRivero']

In [37]: domains
Out[37]: ['google.com', 'abc.net']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2015-11-22
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多