2016-12-15 16 views
1

私はウェブサイトのチャットルームにログインし、コンテンツをスクラップし、ファイルに書き込んでフォーマットします。それはうまくいきますが(ゆっくりですが)、チャットルームが実行時にどのように見えるのかしか分かりません。私がしたいことは違いを追加することです。2つのテキストファイルを比較して差分を1つに追加します

私はこれをやっていると思っていましたが、タイトルはマスターファイルと一時ファイルでした。マスターファイルは常に存在し、テンポラリファイルはマスタと比較して書き込まれます。 2つのファイルが比較され、2つのファイルの間に違いがあれば、tempからmasterにコピーされます。私は他のソリューションにもオープンしていますが、これは実行可能なもののようです。ファイルは常にローカルに保存され、プログラムもローカルで実行されます。

どこから始めるべきかわかりません。私のコードは以下の通りです。私はそれが乱雑であり、改訂を必要としていることを知っています。私はまだPythonの初心者です。

import mechanize 
import fileinput 
import re 
from os import chdir 
from os import environ 
from time import strftime 

home = environ['HOME'] 
file = "ChatLog_" + strftime("%F") + ".txt" 
filename = home + "/" + file 
chdir(home + '/Desktop/') 

# get login forms 
def select_form(form): 
    return form.attrs.get('id', None) == 'auth' 

# authenticate and log raw chat  
def auth(): 
     br = mechanize.Browser() 
     br.set_handle_robots(False) 
     br.open('http://website.com/endpoint') 
     br.select_form(predicate=select_form) 
     br.form['name'] = "username" 
     br.form['pass'] = "password" 
     br.submit() 
     text_file = open(filename, 'w') 
     response = br.response().read() 
     text_file.write(response) 
     text_file.close() 

n = 0 
while n < 9999: 
    try: 
     auth() 

     # strip first line 
     with open(filename, 'r') as fin: 
      data = fin.read().splitlines(True) 
     with open(filename, 'w') as fout: 
      fout.writelines(data[2:]) 

     # strip nbsp characters 
     with open(filename, 'r+') as f: 
      text = f.read() 
      text = re.sub('&nbsp;', '', text) 
      f.seek(0) 
      f.write(text) 
      f.truncate() 

     # strip #039 apostrophe characters 
     with open(filename, 'r+') as f: 
      text = f.read() 
      text = re.sub('&#039;', '\'', text) 
      f.seek(0) 
      f.write(text) 
      f.truncate() 

     # strip everything that lives in and around brackets, i.e. HTML tags 
     with open(filename, 'r+') as f: 
      text = f.read() 
      text = re.sub('<.*?>', '', text) 
      f.seek(0) 
      f.write(text) 
      f.truncate() 

     n = n + 1 
     print(n) 
    except KeyboardInterrupt: print("\nUser aborted."); quit() 
+0

「comm」unix utilを見てみましょうか? – lolopop

答えて

2

あなたが継続的にサイトにpingを実行したいと重複行をスキップ気にしない場合は(あなたが安全に、ユーザーが一般的にまったく同じことを記述しないと仮定することができますか?)あなたはこれについて行くことができる1つの簡単な方法あなたのスクレープの結果をセットで保存しています。次に、symmetric differenceまたはdifferenceのいずれかを取ることで、それらの違いがわかります。 (*その他)
set - other - ...
が他人にていない集合の要素を持つ新しいセットを返します

違いを:あなたが使用したバージョンを使用して、適用したいロジックに依存することになります。

symmetric_difference セットまたは他の両方ではなくどちらかの要素を持つ(他の)
set^other
戻り新しいセット。

例:

old_lines=['chat1', 'chat2'] 
new_lines = ['chat1', 'chat2', 'chat3'] 
set(old_lines)^set(new_lines) 

出力{'chat3'}。あなたはまた、差分の順序を気にする場合は、ちょうどあなたがファイルを差分ので行くことに決めた場合、Pythonの標準ライブラリはdifflibを持っています。OrderedSet


で設定置き換えますdocs

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n'] 
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n'] 
>>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'): 
...  sys.stdout.write(line) 
--- before.py 
+++ after.py 
@@ -1,4 +1,4 @@ 
-bacon 
-eggs 
-ham 
+python 
+eggy 
+hamster 
guido 
+0

あなたは定期的な違いをしたくないですか?新しく生成されたデータからラインを取り出し、既にマスタにあるものを削除しますか?さもなければ、マスターに既にあるが、新しいものではないものはファイルに書き直されるだろう。 –

+0

@ TadhgMcDonald-Jensenこのような方法はありますか?上記の場合、彼は確実に+ラインを維持することができます。ただし、一部のチャットでも削除が許可されているので、有用であると思われるかもしれません。 – themistoklik

+0

引き算: '{'a'、 'b'、 'c'、 'd'} - {'a'、 'b'、 'H'} == { 'c'、 'd'} 'と削除の場合' master 'は' new 'に現れなかった行を保持し、対称的な違いになり、 'master'に書き出します。それでも間違った結果に見える。 –

関連する問題