无法通过 Selenium Python 在可折叠窗口中找到段落文本元素
Posted
技术标签:
【中文标题】无法通过 Selenium Python 在可折叠窗口中找到段落文本元素【英文标题】:Unable to find paragraph text element in collapsable window via Selenium Python 【发布时间】:2021-06-13 17:54:01 【问题描述】:我正在尝试通过 Python 中的 Selenium 获取网页上可折叠元素的段落文本。到目前为止,可折叠窗口通过 .click 在 Selenium 中打开,但之后 Selenium 无法找到所需的“object-viewer__ocr-articletext”类段落。
Selenium 似乎无法专注于包含新可见元素(如所需段落)的折叠窗口。
页面链接:https://www.delpher.nl/nl/kranten/view?query=kernenergie&facets%5Bpapertitle%5D%5B%5D=Algemeen+Dagblad&facets%5Bpapertitle%5D%5B%5D=De+Volkskrant&facets%5Bpapertitle%5D%5B%5D=De+Telegraaf&facets%5Bpapertitle%5D%5B%5D=Trouw&page=1&sortfield=date&cql%5B%5D=%28date+_gte_+%2201-01-1970%22%29&cql%5B%5D=%28date+_lte_+%2201-01-2018%22%29&coll=ddd&redirect=true&identifier=ABCDDD:010818460:mpeg21:a0207&resultsidentifier=ABCDDD:010818460:mpeg21:a0207&rowid=1
完整代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd
import numpy as np
import re
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--no-proxy-server")
chrome_options.add_argument("--proxy-server='direct://'");
chrome_options.add_argument("--proxy-bypass-list=*");
driver = webdriver.Chrome(options=chrome_options)
driver.set_window_size(1400, 1080)
#Set up the path to the chrome driver
html = driver.find_element_by_tag_name('html')
all_details = []
for c in range(1,2):
try:
driver.get("https://www.delpher.nl/nl/kranten/results?query=kernenergie&facets%5Bpapertitle%5D%5B%5D=Algemeen+Dagblad&facets%5Bpapertitle%5D%5B%5D=De+Volkskrant&facets%5Bpapertitle%5D%5B%5D=De+Telegraaf&facets%5Bpapertitle%5D%5B%5D=Trouw&page=&sortfield=date&cql%5B%5D=(date+_gte_+%2201-01-1970%22)&cql%5B%5D=(date+_lte_+%2201-01-2018%22)&coll=ddd".format(c))
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
incategory = driver.find_elements_by_class_name("search-result")
print(driver.current_url)
links = [ i.find_element_by_class_name("search-result__link").get_attribute("href") for i in incategory]
# Loop through each link to acces the page of each article
for link in links:
# get one book url
driver.get(link)
# newspaper
newspaper = driver.find_element_by_xpath("//*[@id='content']/div[2]/div/div[2]/header/h1/span[2]")
# date of the article
date = driver.find_element_by_xpath("//*[@id='content']/div[2]/div/div[2]/header/div/ul/li[1]")
#click button and find title
div_element = WebDriverWait(driver, 60).until(expected_conditions.presence_of_element_located((By.XPATH,'//*[@id="object"]/div/div/div')))
hover = ActionChains(driver).move_to_element(div_element)
hover.perform()
div_element.click()
button = WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located((By.XPATH, '//*[@id="object-viewer__ocr-button"]')))
hover = ActionChains(driver).move_to_element(button)
hover.perform()
button.click()
element = driver.find_element_by_css_selector(".object-viewer__ocr-panel-results")
driver.execute_script("$(arguments[0]).click();", element)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# content of article
try:
content = driver.find_element_by_class_name("object-viewer__ocr-articletext")
except Exception as e:
print(str(e))
pass
# Define a dictionary with details we need
r =
"1Newspaper":newspaper.text,
"2Date":date.text,
"3Content":content,
# append r to all details
all_details.append(r)
except Exception as e:
print(str(e))
pass
# save the information into a CSV file
df = pd.DataFrame(all_details)
df = df.to_string()
time.sleep(3)
driver.close()
具体这部分代码:
element = driver.find_element_by_css_selector(".object-viewer__ocr-panel-results")
driver.execute_script("$(arguments[0]).click();", element)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# content of article
try:
content = driver.find_element_by_class_name("object-viewer__ocr-articletext")
except Exception as e:
print(str(e))
pass
有没有人建议在可折叠窗口中查找段落文本?
提前致谢。
【问题讨论】:
【参考方案1】:如果没有指向所需网页的链接,就很难确定问题。
我的猜测是,当您单击可折叠组件时,DOM 会发生变化,这意味着它自己的可折叠组件不再属于同一类、ID、名称。
第二个猜测是我们正在处理 iframe,这将需要我们捕获它的 id 并专注于它。
你的错误异常是什么?
【讨论】:
感谢您的评论。您的猜测似乎是合理的,但是我还没有发现 iframe 的存在。链接在原始答案中,您愿意快速浏览一下吗?现在得到的错误是:'消息:没有这样的元素:无法找到元素:“method”:“css selector”,“selector”:“.object-viewer__ocr-articletext”(会话信息:chrome = 89.0。 4389.82) 名称'内容'未定义' 这确实是一个非常奇怪的元素。我确实遇到过类似的情况,即使我在 DOM 中捕获了该元素,该元素在 UI 上也不可见。目前我无法就如何处理它给你一个很好的答案。【参考方案2】:发现展开的元素在整个 HTML 中是可见的。 使用 Urllib 和 BeautifulSoup 创建了一个新代码。
如果有人对新代码感兴趣,请告诉我!
【讨论】:
以上是关于无法通过 Selenium Python 在可折叠窗口中找到段落文本元素的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Python 使用 GeckoDriver 和 Firefox 使 Selenium 脚本无法检测?
Python selenium无法通过ID或xpath填写输入框。
NoSuchElementException:消息:尝试通过 Selenium 和 Python 单击 VISA 按钮时无法找到元素