私のサイバー&情報セキュリティコースでは、WebサイトにあるテーブルからIP範囲を抽出するツールを作成するプロジェクトが与えられました。 Webサイトには、これらのIP範囲の所有者が誰かがわかります。所有者がいない場合は、grep
のwhois
bashコマンドを使用して、空のオーナースポットを埋めることができます。結果をファイルに書き出します。ここでは、コードは次のようになります。Pythonで空の文字列の条件を追加する
#!/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
列で先頭にスペースのカップルを持っているいくつかの「所有者」があります所有者名のこれらの所有者名は、具体的にはwhois
bashコマンドで埋められました。私はこれらのスペースは、次のPython線で追加されたことが判明:調査から
if columnsCounter >= 5 and not isIp:
f.write(column + " ")
私はVAR column
は、ウェブサイト上抜きの所有者の1に等しい場合、それが起こることが分かりました。私はprint column
を実行する場合、私は、その長さが2
である私の質問は、IS (2X宇宙・天体バー)を取得:私は長さによってフィルタリングしたくない(知っている人は、おそらく唯一の2文字が含まれている所有者名があります)。さらに、条件
if column == " ":
(またはその文字列の任意のバリエーション)は機能しません。だから、どのようにその文字列が正確に何であるかを知り、それをフィルタリングするのですか?
2つのスペースの文字列がそれをフィルタリングしていない場合、2つのスペースバープレスではない可能性がありますか?おそらく異なるASCIIまたはUnicodeのcharかもしれません。'print column'の代わりに' ord( '') 'にマッチする文字を' print {ord(c)for c} 'にすることをお勧めします。 –
実際に空白の場合は、その行を 'f.write(column.strip()+" ")'に変更することで取り除くことができます。 – Antimony
@AlexanderReynoldsありがとうたくさんの男!私はその "ord"機能について以前は知らなかった。今私はそれについて読んでおり、私はすでにこれらの "2つのスペース"が実際に拡張ASCII文字であることを発見しました。 –