2017-06-19 11 views
1

私はPythonには新しく、サブディレクトリからリンクを取得するためにウェブサイトスクレーパーを作成しようとしています。後で別のクラスに渡して、imagureから画像を自動ダウンロードします。このコードスニペットでPythonリストオブジェクトに属性エラーがありません

、私はちょうどsubredditを読んでのhrefから任意のimagurのHTMLSをこすりしようとしていますが、私は次のエラーを取得する:

AttributeError: 'list' object has no attribute 'timeout' 

任意のアイデアをこれが起こっかもしれない理由を?ここでは、コードは次のとおりです。あなたが関数を呼び出す方法で

from bs4 import BeautifulSoup 
from urllib2 import urlopen 
import sys 
from urlparse import urljoin 

def get_category_links(base_url): 
    url = base_url 
    html = urlopen(url) 
    soup = BeautifulSoup(html) 
    posts = soup('a',{'class':'title may-blank loggedin outbound'}) 
    #get the links with the class "title may-blank " 
    #which is how reddit defines posts 
    for post in posts: 
     print post.contents[0] 
     #print the post's title 

     if post['href'][:4] =='http': 
      print post['href'] 
     else: 
      print urljoin(url,post['href']) 
     #print the url. 
     #if the url is a relative url, 
     #print the absolute url. 


get_category_links(sys.argv) 
+1

完全なトレースバックを送信するか、行番号を記述してください。 –

+1

urlopenで '.read()'を使いましたか? –

+2

トレースバックを含む完全なエラーメッセージを投稿してください。このエラーはコードによって直接発生するものではなく、使用しているライブラリの1つから来ています。 – kindall

答えて

4

ルック:

get_category_links(sys.argv) 

sys.argvここで最初の項目は、スクリプト名そのものであるスクリプト引数のリストです。これはあなたのbase_url引数の値がurlopenの失敗につながるリストであることを意味します

>>> from urllib2 import urlopen 
>>> urlopen(["I am", "a list"]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen 
    return opener.open(url, data, timeout) 
      │   │ │  └ <object object at 0x105e2c120> 
      │   │ └ None 
      │   └ ['I am', 'a list'] 
      └ <urllib2.OpenerDirector instance at 0x105edc638> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 422, in open 
    req.timeout = timeout 
    │    └ <object object at 0x105e2c120> 
    └ ['I am', 'a list'] 
AttributeError: 'list' object has no attribute 'timeout' 

あなたはsys.argvから2番目の引数を取得し、get_category_linksにそれを渡すためのもの:

get_category_links(sys.argv[1]) 

それは面白いですしかし、この場合のエラーをどのように理解するのが難解で難しいのですか。これは、"url opener" works in Python 2.7の方法から来ています。

def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): 
    # accept a URL or a Request object 
    if isinstance(fullurl, basestring): 
     req = Request(fullurl, data) 
    else: 
     req = fullurl 
     if data is not None: 
      req.add_data(data) 

    req.timeout = timeout # <-- FAILS HERE 

behavior have not actually changed in the latest stable 3.6 as wellこと:、url値(第1引数)が文字列でない場合、それはRequestインスタンスであり、その上にtimeout値を設定しようと想定しています。

+0

答えの中で自分のようなトレースバックをきれいに印刷する方法を共有できますか?ありがとう。 – zhenguoli

+0

@zhenguoli確かに、これは非常にクールで便利な[もっと良い例外](https://github.com/Qix-/better-exceptions)プロジェクトです。ありがとう。 – alecxe

+0

ありがとうございました。あなたはとても親切です。 – zhenguoli

関連する問題