【发布时间】:2021-12-11 04:14:49
【问题描述】:
我需要抓取一个包含列表的网站。单击任何列表元素会显示一个模式对话框,其中包含我要抓取的一些文本。在循环中执行此操作会产生陈旧元素异常,所以这就是我最初所做的
elems = browser.find_elements_by_xpath("//a[@data-toggle='modal']")
temp_names = []
for elem in elems:
temp_names.append(elem.text)
单击此锚标记元素会显示模态对话框,因此我将所有这些元素的文本存储在一个列表中,最后我这样做了:
for temp_name in temp_names:
print(temp_name)
modals= browser.find_element_by_xpath("//a[contains(text(),'"+temp_name+"')]")
modals.click()
time.sleep(1)
# rest of the scraping code
现在即使 temp_name 打印正确的文本,我也会收到 No element exception 错误。网页结构如下:
<div class="...">
<h4 class="...">
<a href=# data-toggle="modal" data-target="#(target modal dialogue id)">Text</a>
</h4>
. . .
(Some Other tags)
. . .
</div>
<div id =(modal dialogue id) class="..." role="dialog">
. . .
(Some text I want to Scrape)
. . .
</div>
锚标记中的文本是我正在寻找的文本。我计划通过文本查找元素,然后单击它,然后在循环结束时使用 browser.get(URL) 返回到原始 url,并再次找到第二个元素,依此类推。 我不明白为什么它无法找到元素,因为我刚刚在上一个循环中获得了元素文本。另外,如果有更好的方法,请分享。
注意:除非我先点击,否则我不能直接从模态对话框 div 中抓取,否则返回的文本将为空。
编辑:
以下是我当前的代码:
chromedriver = 'C:\\chromedriver.exe'
chop = webdriver.ChromeOptions()
chop.add_extension('C:\\AdBlock_v3.38.1.crx')
time.sleep(5)
browser = webdriver.Chrome(chromedriver, chrome_options = chop)
for i in range(1,22):
browser.get("http://pasha.org.pk/members/page/"+str(i)+"/")
time.sleep(1)
elems = browser.find_elements_by_xpath("//a[@data-toggle='modal']")
print(len(elems))
temp_names = []
for elem in elems:
temp_names.append(elem.text)
current = browser.current_url
for temp_name in temp_names:
print()
print(temp_name)
print()
modals= browser.find_element_by_xpath(f"//a[contains(text(), '{temp_name}')]")
modals.click()
time.sleep(1)
# elem2 = browser.find_element_by_xpath("//button[@class='close']")
# time.sleep(1)
browser.get(current)
以下是我得到的错误的 sn-p:
【问题讨论】: