我使用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)
它有时会在data
中返回NOTHING或者说:
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 :(得分:1)
如果数据不在原始HTML页面中,但是在后台从JS代码返回,请考虑使用无头浏览器,例如PhantomJS和Selenium。 Here's an example
答案 1 :(得分: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"