为"空"添加条件Python中的字符串

时间:2017-09-12 17:36:17

标签: python bash beautifulsoup

在我的网络与信息安全课程中,我获得了一个项目来构建一个工具,该工具从位于网站上的表中提取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 == " ":(或该字符串的任何变体)的条件不起作用。那么如何才能确切地找出该字符串是什么并过滤它呢?

1 个答案:

答案 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()方法,它检查字符串是否只包含空格。可能你甚至可以在你原来奇怪的列名上使用它;但是我不确定你的角色是否会被包含在这个函数的空白中,因为我不知道这个角色是什么。