python - 无法从网页中获取文本

标签 python python-3.x selenium selenium-webdriver web-scraping

我使用 python 和 selenium 创建了一个脚本,以获取以下链接中的所有可用文本。该网页已激活延迟加载方法,这就是为什么每次滚动时都会看到更多内容。我的脚本也可以处理。

但是,问题是当我的脚本使网页到达底部耗尽其内容时,它卡在了那里。一旦它可以跳出循环,我就可以获取内容。我怎样才能跳出循环?

我知道 .LoadingDots 始终存在。这是我找不到任何逻辑来打破循环的唯一原因。

Link to that site

这是我到目前为止尝试过的方法:(无法摆脱循环)

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/

相关文章:

python - SQLAlchemy order_by 多对多关系通过关联代理

python-3.x - 使用 Python 在图像上应用过滤器

python - 如何在python 3中找到任意列表中缺失的数字?

c# - 遮蔽元素名称改变ID

python - 将一年中的几周分开并计算数据框中的平均值

python - 将制表符分隔文件的列读入变量

python - 多线程时循环不使用新变量运行

java - 如何在 Selenium webdriver 中选择 "Span Type dropdown"中的值

java - 获取表大小时如何排除表的第一行和最后一行

python - 使用mechanize登录megaupload