2017-01-04 7 views
4

ユニークなIDを持つテキストファイルに100万件の奇妙なURLと検索語句があります。 URLを開いてsearchtermsを検索する必要があります。存在する場合は1、それ以外の場合は0となります。URLエラーの単語を検索する

入力ファイル:

"ID" "URL","SearchTerm1","Searchterm2" 
"1","www.google.com","a","b" 
"2","www.yahoo.com","f","g" 
"3","www.att.net","k" 
"4" , "www.facebook.com","cs","ee" 

コードスニペット:

import urllib2 
import re 
import csv 
import datetime 
from BeautifulSoup import BeautifulSoup 

with open('txt.txt') as inputFile, open ('results.txt','w+') as proc_seqf: 
     header = 'Id' + '\t' + 'URL' + '\t' 
     for i in range(1,3): 
      header += 'Found_Search' + str(i) + '\t' 
     header += '\n' 
     proc_seqf.write(header) 
     for line in inputFile: 
      line=line.split(",") 
      url = 'http://' + line[1] 
      req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
      html_content = urllib2.urlopen(req).read() 
      soup = BeautifulSoup(html_content) 
      if line[2][0:1] == '"' and line[2][-1:] == '"': 
       line[2] = line[2][1:-1] 
      matches = soup(text=re.compile(line[2])) 
      #print soup(text=re.compile(line[2])) 
      #print matches 
      if len(matches) == 0 or line[2].isspace() == True: 
       output_1 =0 
      else: 
       output_1 =1 
      #print output_1 
      #print line[2] 
      if line[3][0:1] == '"' and line[3][-1:] == '"': 
       line[3] = line[3][1:-1] 
      matches = soup(text=re.compile(line[3])) 
      if len(matches) == 0 or line[3].isspace() == True: 
       output_2 =0 
      else: 
       output_2 =1 
      #print output_2 
      #print line[3] 

      proc_seqf.write("{}\t{}\t{}\t{}\n".format(line[0],url,output_1, output_2)) 

出力ファイル:コードで

ID,SearchTerm1,Searchterm2 
1,0,1 
2,1,0 
3,0 
4,1,1 

2つの問題:

  1. 私は約200 URLを一度に実行すると、urlopen error [Errno 11004] getaddrinfo failed errorとなります。

  2. 正確には一致するものの、正確には一致しないものを検索する方法はありますか?

+0

なぜ反対票:

だからあなたは、このようなオプションの末尾のドットに一致するように正規表現を構築するだろうか? – Zack

+0

私は、理由が閉鎖投票で示唆されていると思う:広すぎる。あなたは1回の投稿で3つの質問をしました。そのうちの2番目は実際にはStack OverflowではなくCode Reviewに属しています。 – Prune

+0

@Pruneコードに変更を加えていただきありがとうございます。 – Zack

答えて

2

私はそれは私にurlopenエラーを与えた後に、約200のURLを実行します[ERRNO 11004] のgetaddrinfoはエラーに失敗しました。

このエラーメッセージは、 URLをホストしているサーバーのDNSルックアップが失敗したことを示しています。

これはプログラムの制御外ですが、あなたは状況を処理する方法を決定することができます 。

最も簡単な方法は、トラップするとエラーになり、それを記録し続けていく:

try: 
    html_content = urllib2.urlopen(req).read() 
except urllib2.URLError as ex: 
    print 'Could not fetch {} because of {}, skipping.'.format(url, ex) 
    # skip the rest of the loop 
    continue 

しかし、それはエラーが一時的で、かつ検索が 作業後でしようとする場合は、その可能性があります。例えば、おそらくDNSサーバは、あまりにも多くの時間をあまりにも多く受信すると、受信要求を拒否するように に設定されています。この状況で
、あなたは遅延後に再試行する関数を書くことができます密接に一致するものを検索する方法ではなく、完全一致が

import time 

class FetchException(Exception): 
    pass 

def fetch_url(req, retries=5): 
    for i in range(1, retries + 1): 
     try: 
      html_content = urllib2.urlopen(req).read() 
     except urllib2.URLError as ex: 
      print 'Could not fetch {} because of {}, skipping.'.format(url, ex) 
      time.sleep(1 * i)) 
      continue 
     else: 
      return html_content 
    # if we reach here then all lookups have failed 
    raise FetchFailedException() 

# In your main code 
try: 
    html_content = fetch_url(req) 
except FetchFailedException: 
    print 'Could not fetch {} because of {}, skipping.'.format(url, ex) 
    # skip the rest of the loop 
    continue 

ありますか?

文字列とオプションの末尾のドットを一致させる場合は、修飾子?を使用します。 docsから

は、得られたRE先行するREの0または1回の繰り返しに一致させます。 ab? 'a'または 'ab'と一致します。

>>> s = 'Abc In' 
>>> m = re.match(r'Abc In.', s) 
>>> m is None 
True 

# Surround `.` with brackets so that `?` only applies to the `.` 
>>> m = re.match(r'Abc In(.)?', s) 
>>> m.group() 
'Abc In' 
>>> m = re.match(r'Abc In(.)?', 'Abc In.') 
>>> m.group() 
'Abc In.' 

正規表現パターンの前r文字に注目してください。これはraw stringを示します。正規表現では非常に一般的なバックスラッシュ(\)文字を扱いやすくするため、正規表現パターンで生の文字列を使用することをお勧めします。理由を述べずに

matches = soup(text=re.compile(r'{}(.)?').format(line[2]))

+0

ありがとうございます@snakecharmerbいつですか?私はちょうど" Abc In "を持っていれば返されますか?私は試してみることの最初のロジックを実装しようとすると私はすべてのURLのエラーをフェッチすることはできませんでしたか? – Zack

+0

私たちはチャット私はカップルの感謝のカップルを持つことができますhttp://chat.stackoverflow.com/rooms/132718/room-for -zack-and-snakecharmerb – Zack