硒包含无法在对话框中找到元素的文本

时间:2019-03-13 19:28:26

标签: python selenium

我需要抓取一个包含列表的网站。单击任何列表元素将显示一个模式对话框,其中包含一些我要剪贴的文本。循环执行此操作将获取陈旧的元素异常,所以这是我最初所做的

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 scrapping code

现在,即使temp_name打印正确的文本,我也没有出现任何元素异常错误。该网页的结构如下:

<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 Scrap)
    .   .   .    
</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)

以下是我得到的错误的摘要:

Error when code runs

1 个答案:

答案 0 :(得分:0)

您可以尝试做一些事情-我认为您的引号可能会使语法有些混乱,但是如果那是问题,我不确定为什么它会在第一个循环中起作用。...

modals= browser.find_element_by_xpath(f"//a[contains(text(), '{temp_name}')]")

modals= browser.find_element_by_xpath("//a[contains(text(), '" + temp_name + "')]")

这些定义中的任何一个都更好吗?

如果没有,您可以上传您收到的完整错误文本吗?

编辑以解决OP的问题:“我需要点击所有带有data-toggle ='modal'的标签”

对我来说,以下xPath返回20个<a>元素,其中包含data-toggle='modal'

modals= browser.find_element_by_xpath("//a[@data-toggle='modal']")