真的需要这个社区的帮助!
我正在使用Selenium和Beautiful Soup对Python中的动态内容进行网络抓取。 问题是定价数据表无法解析为Python,即使使用以下代码:
html=browser.execute_script('return document.body.innerHTML')
sel_soup=BeautifulSoup(html, 'html.parser')
但是,我后来发现,如果在使用上面的代码之前单击WebPage上的“查看所有价格”按钮,我可以将该数据表解析为python。
我的问题是如何在我的python中解析并访问那些隐藏的动态td标签信息,而不使用Selenium点击所有“查看所有价格”按钮,因为有这么多。
我正在进行网页剪贴的网站的网址是https://www.cruisecritic.com/cruiseto/cruiseitineraries.cfm?port=122, 附图是我需要的动态数据表的html。 enter image description here
真的很感谢这个社区的帮助!
答案 0 :(得分:1)
您应该在加载后定位元素,然后通过arguments[0]
而不是整个页面document
html_of_interest=driver.execute_script('return arguments[0].innerHTML',element)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
这有两个实际案例:
元素尚未加载到DOM中,您需要等待元素:
browser.get("url")
sleep(experimental) # usually get will finish only after the page is loaded but sometimes there is some JS woo running after on load time
try:
element= WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'your_id_of_interest')))
print "element is ready do the thing!"
html_of_interest=driver.execute_script('return arguments[0].innerHTML',element)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
except TimeoutException:
print "Somethings wrong!"
元素在阴影根中,你需要首先扩展阴影根,可能不是你的情况,但我会在这里提到它,因为它与将来的参考相关。例如:
import selenium
from selenium import webdriver
driver = webdriver.Chrome()
from bs4 import BeautifulSoup
def expand_shadow_element(element):
shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
return shadow_root
driver.get("chrome://settings")
root1 = driver.find_element_by_tag_name('settings-ui')
html_of_interest=driver.execute_script('return arguments[0].innerHTML',root1)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
sel_soup# empty root not expande
shadow_root1 = expand_shadow_element(root1)
html_of_interest=driver.execute_script('return arguments[0].innerHTML',shadow_root1)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
sel_soup