【发布时间】: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