在我的网络与信息安全课程中,我获得了一个项目来构建一个工具,该工具从位于网站上的表中提取IP范围。
该网站还告诉我们谁是这些IP范围的所有者,如果没有所有者,该工具使用whois
bash命令和grep
填充空的所有者位置。我写入文件的结果。这是代码:
#!/usr/bin/python
from os import popen
import bs4 as bs
import urllib
columnsCounter = 0
previousIp = ""
def ipCheck(currentIp):
try:
ipSplit = currentIp.split(".")
if 1 <= len(ipSplit[0]) <= 3 and 1 <= len(ipSplit[1]) <= 3 and 1 <= len(ipSplit[2]) <= 3 and 1 <= len(ipSplit[3]) <= 3:
result = ".".join(ipSplit)
return result
else:
return
except:
return
web = urllib.urlopen('http://www.nirsoft.net/countryip/al.html').read()
soup = bs.BeautifulSoup(web,'lxml')
someData = soup.find_all("table", {"border":"1","cellpadding":"6","bordercolor":"#000000"})
itemsList = someData[0].contents[2:]
f = open("ip.db", "w")
f.write("From IP\t\tTo IP\t\tNum IPs\tAssign Date\tOwner\n")
f.close()
f = open("ip.db", "a")
for item in itemsList:
row = item.text[1:].split(" ")
for column in row:
column = column.encode("UTF-8")
columnsCounter += 1
isIp = ipCheck(column)
if columnsCounter >= 5 and not isIp:
f.write(column + " ")
elif columnsCounter == 6 and isIp:
cmd = "whois {} | grep desc | tail -n 1".format(previousIp)
owner = popen(cmd).read().encode("UTF-8")
owner = "{}\n".format(owner[16:-1])
f.write(owner)
columnsCounter = 1
elif columnsCounter > 5 and isIp is not None:
f.write("\n")
columnsCounter = 1
if columnsCounter <= 4:
f.write(column + "\t")
if columnsCounter == 1:
previousIp = column
f.close()
输出文件如下所示:
> From IP To IP Num IPs Assign Date Owner
> 31.22.48.0 31.22.63.255 4096 25/03/11 Albanian Mobile Communications SH.A.
> 31.44.64.0 31.44.79.255 4096 24/02/11 Abissnet sh.a.
> 46.99.0.0 46.99.255.255 65536 08/06/10 IPKO-469900/22
> 46.252.32.0 46.252.47.255 4096 17/12/10 4ALB shpk
> 77.242.16.0 77.242.31.255 4096 22/02/07 Abissnet sh.a.
> 79.106.0.0 79.106.255.255 65536 23/11/07 Albtelecom Sh.a.
> 80.78.64.0 80.78.79.255 4096 04/07/01 ABCOM Shpk
> 80.80.160.0 80.80.175.255 4096 17/07/01 IPKO-8080160
> 80.90.80.0 80.90.95.255 4096 03/06/05 ADA Holding - ADA AIR sh.p.k.
> 80.91.112.0 80.91.127.255 4096 09/06/05 Abissnet sh.a.
> 82.114.64.0 82.114.95.255 8192 22/12/03 Kujtesa Network
> 84.20.64.0 84.20.95.255 8192 02/09/04 Pronet sh.p.k.
> 91.187.96.0 91.187.127.255 8192 24/11/06 IPKO-9118796
> 92.60.16.0 92.60.31.255 4096 30/11/07 Abissnet sh.a.
> 95.107.128.0 95.107.255.255 32768 02/12/08 "Albanian Satellite Communications" sh.p.k.
> 109.104.128.0 109.104.159.255 8192 04/09/09 ITirana Sh.p.k.
> 109.236.32.0 109.236.47.255 4096 30/11/09 Abissnet sh.a.
> 134.0.32.0 134.0.63.255 8192 01/11/11 Agjencia Kombetare Shoqerise se Informacionit
> 213.207.32.0 213.207.63.255 8192 22/12/05 VIVO Communications Sh p k
> 217.21.144.0 217.21.159.255 4096 21/10/10 Nisatel LTD
> 217.24.240.0 217.24.255.255 4096 14/05/03 Albtelecom Sh.a.
> 217.73.128.0 217.73.143.255 4096 17/01/11 ABCOM Shpk
问题是:Owner
列下有几个&#34;所有者&#34;在所有者名称的开头有几个空格。这些所有者名称由whois
bash命令专门填充。我发现这些空格是由以下python行添加的:
if columnsCounter >= 5 and not isIp:
f.write(column + " ")
通过调查我发现,当var column
等于网站上的其中一个被清空的所有者时,就会发生这种情况。如果我运行print column
,我会得到长度为2的(2个空格键)。
我的问题是:我不想按长度过滤(谁知道,也许有一个只包含2个字符的所有者名称)。此外,if column == " ":
(或该字符串的任何变体)的条件不起作用。那么如何才能确切地找出该字符串是什么并过滤它呢?
答案 0 :(得分:1)
如评论中所述,如果您的过滤不匹配,则很可能它们实际上并不是标准的空格键。某些字符ord(ch)
的python函数ch
将给出字符的数字表示,以便您可以将其与其他类似字符的歧义消除歧义。
当然,您可以在发现它时将 字符过滤掉。但另一种方法,可能会更好,将是&#34;消毒&#34;你的字符串---删除所有不是字母或字母数字或其他内容的字符,并删除你的空格,让你实际过滤掉一个空字符串。
例如,您可以清理其中包含一些意外字符的列;在这种情况下,字符串包含一个数字,一些非英语字符,以及扩展ASCII表中不是字母数字的符号。如果我们想保留除该符号之外的所有内容,可以这样做:
>>> column = "5ome çharß ¼"
>>> "".join([c for c in column if c.isalpha() or c.isdigit() or c == ' '])
'5ome çharß '
它保留了数字,字母字符,甚至非英文字符和空格,但不保留¼
符号。您可以检查此已清理的字符串是否等于空字符串。我认为这个解决方案很好,因为它相对较好地推广。
如果你担心仍然可能有空格,你可以.strip()
字符串,默认情况下会用空格去掉它,如果那是唯一的东西,它就是#&# 39;给你一个空字符串。还有一个'some string'.isspace()
方法,它检查字符串是否只包含空格。可能你甚至可以在你原来奇怪的列名上使用它;但是我不确定你的角色是否会被包含在这个函数的空白中,因为我不知道这个角色是什么。