Python 如何等待站点使用Beautifulsoup4返回数据

Python 如何等待站点使用Beautifulsoup4返回数据,python,beautifulsoup,Python,Beautifulsoup,我使用beautifulsoup4编写了一个脚本,该脚本基本上从网页上的表中获取密码列表 问题是我的python脚本没有等待返回的网页内容,或者中断,或者说“列表索引超出范围”。代码如下: 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 CYE

我使用beautifulsoup4编写了一个脚本,该脚本基本上从网页上的表中获取密码列表

问题是我的python脚本没有等待返回的网页内容,或者中断,或者说“列表索引超出范围”。代码如下:

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)
它有时在
数据中不返回任何内容,或者说:

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
回溯(最近一次呼叫最后一次):
文件“multiple_scan_es.py”,第79行,在
扫描\u密码\u ssl(列表\u url)
文件“multiple_scan_es.py”,第62行,在scan_cipher_ssl中
table=soup.find_all('table',class='reportTable',limit=5)[-1]
索引器:列表索引超出范围

我需要在这里等待,怎么办?

< P>如果原始HTML页面中没有数据,但从后台的JS代码返回,考虑使用无头浏览器,比如PhantomJS,用Selea.p> 我认为这个页面使用JavaScript来获取数据,但它使用旧的HTML方法来刷新页面


它添加HTML标记
此页面用户JavaScript以从服务器获取数据并显示它<代码>请求
BS
不执行JavaScript,因此无法通过这种方式获取此数据。您需要Selenium来控制可以执行JavaScript的浏览器或使用其他执行JavaScript的工具。或者您必须获取使用JavaScript的URL,并将其用于
请求
更改脚本需要我付出多少努力?因为这个问题@furas,我想知道如果我使用thoseSelenium,需要调整的地方是什么使用浏览器Chrome/Firefox来呈现页面(并运行JavaScript),并提供类似于
wait(time)的功能
在获取包含JavaScript所有修改的HTML之前等待。其他方法:首先在Chrome中使用
开发工具
,或在Firefox中使用
Firebug
进行“间谍”浏览器和服务器之间的通信,以获取JavaScript使用的URL,以后您可以在脚本中使用此URL进行
请求
-它需要使用
开发工具进行更多的手动操作
,但以后您的脚本不必像Selenium那样等待数据。更改脚本需要我付出多少努力?由于这个问题,它不应该超过几行,但是您需要在代码上做一些工作。从SSL实验室的输出来看,当一个站点有多个服务器(例如google.com)时,您没有考虑到这一点。最初您不会得到报告,而是服务器列表。还有,为什么会有奇怪的缩进?因为我在后端只有两台服务器,所以我需要刷新
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"