我使用 python 和 selenium 创建了一个脚本,以获取以下链接中的所有可用文本。该网页已激活延迟加载方法,这就是为什么每次滚动时都会看到更多内容。我的脚本也可以处理。
但是,问题是当我的脚本使网页到达底部耗尽其内容时,它卡在了那里。一旦它可以跳出循环,我就可以获取内容。我怎样才能跳出循环?
我知道 .LoadingDots
始终存在。这是我找不到任何逻辑来打破循环的唯一原因。
这是我到目前为止尝试过的方法:(无法摆脱循环)
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 as EC
driver = webdriver.Chrome()
wait = WebDriverWait(driver,10)
driver.get("https://www.quora.com/topic/American-Football")
while True:
try:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".LoadingDots")))
except Exception: break
for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ui_qtext_rendered_qtext .ui_qtext_para"))):
print(item.text)
driver.quit()
我知道如果我遵守以下内容我可以解决问题:
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 as EC
from selenium.common.exceptions import TimeoutException
driver = webdriver.Chrome()
wait = WebDriverWait(driver,10)
driver.get("https://www.quora.com/topic/American-Football")
last_len = len(wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ui_qtext_rendered_qtext .ui_qtext_para"))))
while True:
for load_more in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a[id$='_more']"))):
driver.execute_script("arguments[0].click();",load_more)
try:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait.until(lambda driver: len(wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ui_qtext_rendered_qtext .ui_qtext_para")))) > last_len)
items = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ui_qtext_rendered_qtext .ui_qtext_para")))
last_len = len(items)
except TimeoutException: break
for item in items:
print(item.text)
driver.quit()
我的问题是:如何使用我在第一个脚本中尝试使用 .LoadingDots
的方式从耗尽所有卷轴的页面中获取内容?
最佳答案
当页面滚动到按钮时,具有类 .LoadingDots.regular
的元素保持不变,但其父元素添加了新类 hidden
。您可以使用 get_attribute
函数检查该类是否已添加。您也可以直接使用类 spinner_display_area
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
loading_dots = driver.find_element_by_class_name('spinner_display_area')
if 'hidden' in loading_dots.get_attribute('class'):
break;
关于python - 无法从网页中获取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522435/