2017-09-12 12 views
0

私のサイバー&情報セキュリティコースでは、WebサイトにあるテーブルからIP範囲を抽出するツールを作成するプロジェクトが与えられました。 Webサイトには、これらのIP範囲の所有者が誰かがわかります。所有者がいない場合は、grepwhois 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 == " ":(またはその文字列の任意のバリエーション)は機能しません。だから、どのようにその文字列が正確に何であるかを知り、それをフィルタリングするのですか?

+3

2つのスペースの文字列がそれをフィルタリングしていない場合、2つのスペースバープレスではない可能性がありますか?おそらく異なるASCIIまたはUnicodeのcharかもしれません。'print column'の代わりに' ord( '') 'にマッチする文字を' print {ord(c)for c} 'にすることをお勧めします。 –

+1

実際に空白の場合は、その行を 'f.write(column.strip()+" ")'に変更することで取り除くことができます。 – Antimony

+1

@AlexanderReynoldsありがとうたくさんの男!私はその "ord"機能について以前は知らなかった。今私はそれについて読んでおり、私はすでにこれらの "2つのスペース"が実際に拡張ASCII文字であることを発見しました。 –

答えて

1

コメントに記載されているとおり、フィルタリングが一致しない場合は、実際には標準のスペースバープレスではない可能性があります。いくつかの文字chのためのpython関数ord(ch)は、他の同様の見た目の文字から曖昧さを取り除くことができるように、文字の数値表現を与えます。

もちろん、という文字を見つけたらという文字をフィルタリングするだけで済みます。しかし、別の方法は、文字列を「サニタイズ」する方法です。アルファベットや英数字以外のものをすべて削除して空白文字列をフィルタリングすることができます。

たとえば、予期しない文字が含まれている列をサニタイズすることができます。この場合、文字列には数字、英語以外の文字、英数字ではない拡張ASCIIテーブルの記号が含まれています。私たちはそのシンボル以外のすべてを維持したい場合は、このような何かをするだろう:

>>> column = "5ome çharß ¼" 
>>> "".join([c for c in column if c.isalpha() or c.isdigit() or c == ' ']) 
'5ome çharß ' 

それは数字、アルファベット文字、でも英語以外のもの、およびスペースではなく ¼シンボルを保ちました。この消された文字列が空の文字列と等しいかどうかを調べることができます。私はこの解決策は比較的よく一般化されているのでいいと思う。

空白が残っている可能性がある場合は、.strip()という文字列をスペースで区切ります。空白の文字列が空白文字で表示されます。また、文字列に空白だけが含まれているかどうかを調べる方法もあります('some string'.isspace())。おそらく、元の奇妙な列名でこれを使用することもできます。あなたのキャラクターがこの機能に空白として含まれるかどうかはわかりません。キャラクターが何であるかわからないからです。

+0

あなたの答えをありがとう。しかし、あなたがコメントに与えた新しい情報は仕事の90%でした。私は次の解決策を得ました: 'elif columnsCounter> = 5、isIp: 列内のchar: 128 <= ord(char )<= 254: exCharFlag = 11 は 他の継続: ブレーク 場合exCharFlag == 0: f.write(列+ "「)他 : exCharFlag = 0 pass' **サイドノート:Iドンコメントに自分のコードを投稿する方法を知っている... –

+0

@GadiTabak優秀!あなたが実用的な解決策を得てうれしい。このタスクを完了する方法はたくさんあります。私の答え/コメントがあなたの質問に答えた場合、あなたはそれを受け入れたものとしてマークすることができますか?また、インラインコードの場合、バッククイックを使用します:\ 'some_code \'はオリジナルの投稿の編集バージョンと同様に 'some_code'を生成します。 :) –

関連する問題