[英]Python, Selenium and Chrome - How do can I detect the end of a page with dynamically generated content?
[英]Get dynamically generated content with python Selenium
之前曾有人问过这个问题,但我已经搜索并尝试过,但仍然无法使它起作用。 关于硒,我是一个初学者。
看看: https : //finance.yahoo.com/quote/FB
我正在尝试通过Web抓取“推荐等级”,在撰写本文时,该等级为2。我尝试过:
driver.get('https://finance.yahoo.com/quote/FB')
time.sleep(10)
rating = driver.find_element_by_css_selector('#Col2-4-QuoteModule-Proxy > div > section > div > div > div')
print(rating.text)
...这不会给我一个错误,但是也不打印任何文本。 我也尝试过使用xpath,class_name等。相反,我尝试了:
source = driver.page_source
print(source)
这也不起作用,我只是获取没有动态生成内容的实际源。 当我在Chrome中单击“查看源代码”时,它不存在。 我尝试将网页保存为Chrome。 没用
然后我发现,如果我保存整个网页,包括图像和css文件以及所有内容,则源代码与仅保存HTML的源代码不同。
当我使用Chrome DOES保存整个网页时获得的HTML文件包含我需要的信息,起初我在考虑使用pyautogui仅对每个网页按Ctrl + S,但是必须有另一种方式。
我需要的信息在html代码中很明显,但是如何在不下载整个网页的情况下获得它?
尝试执行以下操作以生成动态生成的内容(JavaScript):
driver.execute_script("return document.body.innerHTML")
看到类似的问题: 使用Python在Selenium中运行javascript
首先,您需要等待该元素可单击,然后确保在获得评级之前向下滚动到该元素。 尝试
element.location_once_scrolled_into_view
element.text
编辑:
使用以下XPath选择器:
'//a[@data-test="recommendation-rating-header"]//following-sibling::div//div[@class="rating-text Arrow South Fw(b) Bgc($buy) Bdtc($buy)"]'
并且比您将拥有:
rating = driver.find_element_by_css_selector('//a[@data-test="recommendation-rating-header"]//following-sibling::div//div[@class="rating-text Arrow South Fw(b) Bgc($buy) Bdtc($buy)"]')
要提取滑块的值,请使用
val = rating.get_attribute("aria-label")
CSS选择器div.rating-text
可以正常工作,并且在页面上是唯一的。 返回.text
将为您提供所需的值。
下面的脚本回答了一个不同的问题,但是我想这就是您想要的。
import requests
from bs4 import BeautifulSoup
base_url = 'http://finviz.com/screener.ashx?v=152&s=ta_topgainers&o=price&c=0,1,2,3,4,5,6,7,25,63,64,65,66,67'
html = requests.get(base_url)
soup = BeautifulSoup(html.content, "html.parser")
main_div = soup.find('div', attrs = {'id':'screener-content'})
light_rows = main_div.find_all('tr', class_="table-light-row-cp")
dark_rows = main_div.find_all('tr', class_="table-dark-row-cp")
data = []
for rows_set in (light_rows, dark_rows):
for row in rows_set:
row_data = []
for cell in row.find_all('td'):
val = cell.a.get_text()
row_data.append(val)
data.append(row_data)
# sort rows to maintain original order
data.sort(key=lambda x: int(x[0]))
import pandas
pandas.DataFrame(data).to_csv("AAA.csv", header=False)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.