用javascript填充表刮刮页面

时间:2017-07-09 18:15:55

标签: javascript html python-3.x selenium web-scraping

我试图抓取this页面以便稍后将生成数据传递给解析器。

我的问题是该表由多个脚本填充,这些脚本向另一个服务器发出请求。美丽的汤刮擦页面但返回未执行的javascript。因此,我尝试使用selenium在浏览器中打开页面,然后刮掉填充的表格。

当我运行我的代码时,Firefox加载页面然后关闭,但BS仍然返回页面而不填充表格。我已经尝试在完全加载后使用Web控制台检查页面,我可以看到我需要的数据,即一个数据点包含在div =#34; r11"的div标签中。搜索此标记将返回None。

我的想法是a)我使用selenium错误或者b)页面的格式化是因为它看起来与几个"子文档非常深深地嵌套了#34 ; (不确定正确的术语)。

from selenium import webdriver  
from selenium.common.exceptions import NoSuchElementException  
from selenium.webdriver.common.keys import Keys  
from bs4 import BeautifulSoup

arg_therm = ('http://portalweb.cammesa.com/MEMNet1/Pages/Informes%20por%20'
        'Categor%C3%ADa/Operativos/VisorReporteSinComDesp_minimal.asp'
        'x?hora=0&titulo=Despacho%20Generacion%20Termica&reportPath='
        'http://lauzet:5000/MemNet1/ReportingServices/Despacho'
        'GeneracionTermica.rdl--0--Despacho+Generaci%c3%b3n+T%c3%a9rmica')


browser = webdriver.Firefox()  
browser.get(arg_therm)  
html_source = browser.page_source  

browser.quit()

soup=BeautifulSoup(html_source,'lxml')

print(soup.prettify())

print(soup.find('div', {"class": "r11"}))

1 个答案:

答案 0 :(得分:1)

尝试使用以下代码获取所需的表格:

from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

browser = webdriver.Firefox()  
browser.get(arg_therm)

browser.switch_to.frame(browser.find_element_by_xpath('//iframe[starts-with(@name, "RportFramectl00")]'))
browser.switch_to.frame('report')

table_cells = wait(browser, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "r11")))
for cell in table_cells:
    print(cell.text)

这应该等待所需元素的出现并返回那些DIV的列表