python
  • beautifulsoup
  • 2016-10-13 8 views 0 likes 
    0

    私はbeautifulsoup4を使用してスクリプトを作成しましたが、このスクリプトは基本的にWebページに存在するテーブルから暗号のリストを取得します。問題は私のpythonスクリプトがウェブページの返された内容を待つことなく、 "list index out of range"という言葉を壊したり、言ったりします。コードは以下の通りである:サイトがBeautifulsoup4を使用してデータを返すのを待つ方法

    ssl_lab_url = 'https://www.ssllabs.com/ssltest/analyze.html?d='+site 
    req = requests.get(ssl_lab_url) 
    data = req.text 
    soup = BeautifulSoup(data) 
    print CYELLOW+"Now Bringing in the LIST of cipher gathered from SSL LABS for "+str(ssl_lab_url)+CEND 
         for i in tqdm(range(10000)): 
          sleep(0.01) 
          table = soup.find_all('table',class_='reportTable', limit=5)[-1] 
          data = [ str(td.text.split()[0]) for td in table.select("td.tableLeft")] 
         print CGREEN+str(data)+CEND 
         time.sleep(1) 
    

    それは時々dataに何も返さないか、と言う:

    Traceback (most recent call last): 
        File "multiple_scan_es.py", line 79, in <module> 
        scan_cipher_ssl(list_url) 
        File "multiple_scan_es.py", line 62, in scan_cipher_ssl 
        table = soup.find_all('table',class_='reportTable', limit=5)[-1] 
    IndexError: list index out of range 
    

    私はそうする方法を、ここで待っする必要がありますか?

    +0

    このページのユーザーサーバーからデータを取得して表示するJavaScript。 '要求'と 'BS'はJavaScriptを実行しないので、このようにこのデータを取得することはできません。 JavaScriptを実行できるブラウザやJavaScriptを実行する他のツールを制御するには、Seleniumが必要です。または、JavaScriptを使用するURLを取得し、 '要求 'と共に使用する必要があります – furas

    +0

    スクリプトを変更するにはどれだけの労力が必要ですか?この問題のために@furas私はそれらを使用すると微調整する領域を知りたい – Kittystone

    +0

    SeleniumはブラウザのChrome/Firefoxを使ってページをレンダリングし(JavaScriptを実行する)、HTMLを取得する前に待機する 'wait(time)'のような機能を提供しますすべての変更はJavaScriptによって行われます。 – furas

    答えて

    1

    このページはJavaScriptを使用してデータを取得していますが、古いHTMLメソッドを使用してページを更新すると考えていました。

    HTMLタグ<meta http-equiv="refresh" content='**time**; url>を追加し、ブラウザは時間秒後にページをリロードします。

    このタグを確認する必要があります。見つかったら、待機してページを再度読み込む必要があります。ほとんどの場合、待たずにページをリロードすることができ、データを取得するか、このタグを再度検索します。

    import requests 
    from bs4 import BeautifulSoup 
    import time 
    
    site = 'some_site_name.com' 
    url = 'https://www.ssllabs.com/ssltest/analyze.html?d='+site 
    
    # --- 
    
    while True: 
        r = requests.get(url) 
    
        soup = BeautifulSoup(r.text) 
    
        refresh = soup.find_all('meta', attrs={'http-equiv': 'refresh'}) 
        #print 'refresh:', refresh 
    
        if not refresh: 
         break 
    
        #wait = int(refresh[0].get('content','0').split(';')[0]) 
        #print 'wait:', wait 
        #time.sleep(wait) 
    
    # --- 
    
    table = soup.find_all('table', class_='reportTable', limit=5) 
    
    if table: 
        table = table[-1] 
        data = [str(td.text.split()[0]) for td in table.select("td.tableLeft")] 
        print str(data) 
    else: 
        print "[!] no data" 
    
    +0

    ああ、このリフレッシュは必要なものです – Kittystone

    1

    データが元のHTMLページに存在せず、バックグラウンドでJSコードから返された場合は、PhantomJSなどのヘッドレスブラウザをSeleniumで使用することを検討してください。 Here's an example

    +0

    スクリプトを変更するにはどのくらいの労力が必要ですか?この問題のために – Kittystone

    +0

    私はコードの変更を知りたいですが – Kittystone

    +0

    それ以上の線は必要ではありませんが、まずあなたのコードに少し作業が必要です。 SSL Labsの出力を見ると、サイトに複数のサーバーがある場合(google.comなど)は考慮されていません。最初にレポートを取得するのではなく、サーバーのリストを取得します。見てみな。 – owobeid

    関連する問題