2017-03-17 20 views
0

私のPythonスクリプトに何か問題がありますか?定義された関数がpython2.7のforループで使用されました

from BeautifulSoup import BeautifulSoup 
import requests 
import re 
from collections import defaultdict 
import itertools 
import pandas as pd 

def wego(weburl,annot): 
    print 'Go Term: ', weburl.split('=')[-1] 
    html=requests.get(weburl).text 
    soup=BeautifulSoup(html) 
    desc=r"desc=\".*\"" 
    print "GO leave 2 term:",(re.findall(desc,str(soup))[0].split('"')[1]) 
    pattern=r"Unigene.*A" 
    idDF = pd.DataFrame(columns=['GeneID']) #creates a new datafram 
    idDF['GeneID'] = pd.Series(re.findall(pattern,str(soup))).unique() 
    print "Total Go term is :",idDF.shape[0] 
    old=pd.read_csv(annot,usecols=[0,7,8]) 
    getset=pd.merge(left=idDF,right=old,left_on=idDF.columns[0],\ 
    right_on=old.columns[0]) 
    updown=getset.groupby(getset.columns[1]).count() 
    print updown 
    print "Max P-value: ","{:.3e}".format(getset['P-value'].max()) 

with open("gourl.txt") as ur: 
    d=[] 
    for url in ur: 
    we=wego(url,annot="file.csv") 
    d.append(we) 

gourl.txtファイルには、私の質問は、スクリプトが成功することができている理由1

http://stackoverflow.com/questions=1 
http://stackoverflow.com/questions=2 

によっていくつかのURL 1行であるときgourl.txtファイル内の唯一の1つのURLとするとき失敗しました複数の?

エラーは、次のとおりです。

IndexError: list index out of range 
IndexErrorTraceback (most recent call last) 
<ipython-input-79-a852fe95d69c> in <module>() 
    2  d=[] 
    3  for url in ur: 
----> 4   we=wego(url,annot="file.csv") 
    5   d.append(we) 
<ipython-input-4-9fdf25e75434> in wego(weburl, annot) 
    5  soup=BeautifulSoup(html) 
    6  desc=r"desc=\".*\"" 
----> 7  print "GO leave 2 term:",(re.findall(desc,str(soup)) 
[0].split('"')[1]) 
    8  pattern=r"Unigene.*A" 
    9  idDF = pd.DataFrame(columns=['GeneID']) #creates a new dataframe 
IndexError: list index out of range 
+0

'requests.get()'に渡される 'weburl'をチェックしましたか?もう1つは 'requests.get()'レスポンスオブジェクトのステータスコードです。 – heyiamt

+0

あなたのコードを実行しようとしたところ、 'IndentationError:行頭にインデントされたブロックがあると予想されました'を実行しました。これは実行しているコードと同じですか? – Kevin

+0

@ケビンはい、私は正常に実行されました。 '蔵書=(url、annoy = "file.csv")というコードは問題ありません。 – hope

答えて

0

あなたは私たちを与えたスタックトレースを見ると、あなたが答えを見ることができます。最後の行は、あなたが2リストは、この行にアクセスします

print "GO leave 2 term:",(re.findall(desc,str(soup))[0].split('"')[1]) 

で(「範囲外の」)が存在しないリストの要素にアクセスしようとしていることを述べています。 1つは最初に一致したパターンを取得し、もう1つはsplit('"')によって生成される第2の用語を取得します。

おそらく2番目のURLには、このパターンがありません。

あなたはこのようなものを使用することができます:質問は解決策を持っていることを

matches = re.findall(desc, str(soup)) 
tokens = [] 
if matches: 
    tokens = matches[0].split('"') 
if len(tokens) > 1: 
    print("GO leave 2 term:", tokens[1]) 
+0

ありがとう!あなたの提案に基づいて修正すると、スクリプトは完了して実行できます。しかし、gourl.txtファイルに複数のURLがある場合、finally URLだけが結果を得ることができます。 – hope

+0

あなたがスクリプトを実行したいすべてのURL上で、あなたが探していると思われるものについてあなたの前提を確認してください。おそらく、あなたは正規表現で異なるパターンを使うべきです。あなたはより多くの助けが必要な場合は、このスクリプトは、私は私がGoogleドライブにパーサーにしたいURL([リンク](https://drive.googleについての2つのHTMLファイルを保存した –

+0

作業されていないサンプル入力を追加する必要があります.com/open?id = 0B4N58_pNXx8hRk1SeHNvS0FjY2M)と[link](https://drive.google.com/open?id=0B4N58_pNXx8hbDZ0MkZ2eVNYRUk))。 このファイル([link](https://docs.google.com/document/d/1TMps1PmpMvxKFV2cdtdU8JD762_BtHC43UOAccsj9jY/edit?usp=sharing))は、このpythonスクリプトを実行すると私の出力結果と質問です。 – hope

0

とても幸せを。 問題は\ gourl.txtファイルです。間違いなく、改行によって引き起こされる空行は、無効なURLではなく、このスクリプトを中断しました。 ファイルを読み込むときに\ nを削除するだけで修正できます:url=url.strip('\n')

関連する問題