【问题标题】:Scraping dynamic content through Selenium?通过 Selenium 抓取动态内容?
【发布时间】:2016-08-15 05:26:17
【问题描述】:

我正在尝试通过 Selenium 从 Blog 中删除动态内容,但它总是返回未渲染的 JavaScript。

为了测试这种行为,我尝试等到 iframe 完全加载并打印它的内容,打印效果很好,但是当我再次移回父框架时,它只显示未渲染的 JavaScript。

我正在寻找能够打印完全呈现的 HTML 内容的东西

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

driver = webdriver.Chrome("path to chrome driver")   
driver.get('http://justgivemechocolateandnobodygetshurt.blogspot.com/')

WebDriverWait(driver, 40).until(expected_conditions.frame_to_be_available_and_switch_to_it((By.ID, "navbar-iframe")))

# Rendered iframe HTML is printed.
content = driver.page_source
print content.encode("utf-8")

# When I switch back to parent frame it again prints non rendered JavaScript.
driver.switch_to.parent_frame()
content = driver.page_source
print content.encode("utf-8")

【问题讨论】:

  • 因为.page_source返回源,而不是DOM
  • @Fabricator 如何获取更新后的 DOM?
  • @UmarIqbal,您是否尝试过使用find_element 方法之一选择元素?
  • 我认为任何find_element* 命令都应该这样做
  • 或者你可以直接执行javascript code

标签: javascript html python-2.7 selenium web-scraping


【解决方案1】:

问题是 - the .page_source works only in the current context。有"current top-level browsing context" 表示法..意思是,如果您在默认内容上调用它-您将不会获得子iframeelements 的内部HTML-因为您必须切换到@987654328 的上下文@ 并致电.page_source

换句话说,要获得非常完整的页面 HTML,包括 iframe 的页面源,您必须一一切换到 iframe 上下文并单独获取源。

另见:


旧答案:

在获得page_source 之前,我会wait 至少加载一个博客条目:

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

wait = WebDriverWait(driver, 40)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".entry-content")))

print(driver.page_source)

【讨论】:

  • 没关系,还是返回旧的DOM。
  • @UmarIqbal 好的,你说的旧 DOM 是什么意思?你想要的输出是什么?
  • 旧 DOM 我的意思是未渲染的 JavaScript。我想要的只是一个完全呈现的 HTML 内容。
  • @UmarIqbal 谢谢,您能否更具体地指出一个您可能不想在页面源代码中看到的元素?请注意,即使我去网站,等待它加载并检查页面源 - 我仍然会在那里看到带有 javascript 的脚本标签。
  • 你能尝试运行我的代码吗?第一个打印语句打印动态加载的 iframe。之后在第二个打印语句中,我打印了完整的页面源,它​​应该与 iframe 一起打印完整的 DOM,但它没有。
猜你喜欢
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 2022-08-07
  • 2015-05-09
  • 2017-11-12
  • 2021-04-28
相关资源
最近更新 更多