Python Selenium 找不到元素

Posted

技术标签:

【中文标题】Python Selenium 找不到元素【英文标题】:Python Selenium can't find element 【发布时间】:2018-11-07 13:10:40 【问题描述】:

我正在尝试收集一些亚马逊问题和答案,特别是这个: https://www.amazon.com/ask/questions/Tx1AYFFVMESHMZV/ref=ask_ql_ql_al_hza

这是每个问题的 html 部分(可以在开发人员工具中进行 html 检查以获取更多详细信息):

<span class="askExpanderContainer noScriptNotDisplayExpander">
      <span class="askShortText">
        They definitely help stretch the toes. I'm hoping to avoid a hammer toe that has been developing on one foot, and I'm not sure they're doing that, but I read that one way to avoid hammer toes developing is to stretch the toes, so I figure they will help in the long run and probably won't do any harm. From the beginning…
        <a class="a-link-normal askSeeMore" href="#">
          see more
        </a>
      </span>
      <span class="askLongText">
        They definitely help stretch the toes. I'm hoping to avoid a hammer toe that has been developing on one foot, and I'm not sure they're doing that, but I read that one way to avoid hammer toes developing is to stretch the toes, so I figure they will help in the long run and probably won't do any harm. From the beginning never hurt my toes, so I didn't have an adjustment period like some people have described. I use them every day, and I enjoy being calm and still for half an hour or 45 minutes while all I do is stretch my toes. That's worth something too!
        <a class="a-link-normal askSeeLess" href="#">
          see less
        </a>
      </span>
    </span>

我需要完整的答案,但是当我尝试查找 askLongText 元素时,我收到以下错误:

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such 
element: Unable to locate element: "method":"css selector","selector":"span.askLongText"
  (Session info: chrome=66.0.3359.181)
  (Driver info: chromedriver=2.38.552518 (183d19265345f54ce39cbb94cf81ba5f15905011),platform=Mac OS X 10.13.4 x86_64)

但是,我可以成功提取 askShortText 元素。

这是python代码:

driver.get(url)
title = driver.find_element_by_css_selector('p.a-size-large.askAnswersAndComments.askWrapText').text

answers_section = driver.find_element_by_css_selector('div.a-section.askAnswersAndComments.askWrapText')
answers = answers_section.find_elements_by_xpath('div[@id]')

for ans in answers:
    answer = ans.find_element_by_css_selector('span.askLongText').text
    print answer

注意:最后三个答案元素不包含 askLongText 类。稍后我将处理异常,但没有将其放在这里用于测试目的。无论哪种方式,前三个元素确实包含此类,并且应该打印其内容,但这不会发生

【问题讨论】:

你真的知道如何选择答案@Ian Spitz 吗?看来您正在等待更多的答案出现。不是吗? 【参考方案1】:

这对我有用。

see_more_links = driver.find_elements_by_partial_link_text("see more")
for link in see_more_link:
    link.click()
answers = driver.find_elements_by_css_selector("span.askLongText")
for answer in answers:
    print str(answer.text).replace('see less', '')

输出:

它们肯定有助于伸展脚趾。我希望避免被锤子 一只脚一直在发育的脚趾,我不确定它们是 这样做,但我读到避免锤状趾发展的一种方法是 伸展脚趾,所以我认为从长远来看它们会有所帮助 可能不会造成任何伤害。从一开始就没有伤害过我的脚趾,所以 我没有像某些人描述的那样有一个调整期。一世 每天使用它们,我喜欢安静半小时 或 45 分钟,而我所做的只是伸展脚趾。这是值得的 还有东西!

它们绝对会重新调整您的脚趾并拉直您的脚骨。 您需要在开始时定期使用它们来设置它们 更直。疼痛减轻一点后,您可以降低 频率和延长你佩戴它们的时间。他们帮助了我的 在过去的几周里,拇囊炎变得不那么痛苦了。好吧 物有所值,而且绝对比手术好!!

我不知道要永久佩戴它们多久 改善对齐。瑜伽脚趾非常有助于放松脚部和 脚趾紧张,这确实改善了我的行走和平衡。因为 我的一只脚已经长了拇囊炎我怀疑这些会有助于保持 那只脚对齐,但瑜伽脚趾帮助我的脚更好地适应 那个拇囊炎。

【讨论】:

【参考方案2】:

@GPT14 的答案接近完美,但有一个小错误,因为该解决方案还会打印文本 see less 以及每个答案,这基本上不是答案的一部分。要提取确切答案,您可以使用以下代码块:

代码块:

from selenium import webdriver

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get("https://www.amazon.com/ask/questions/Tx1AYFFVMESHMZV/ref=ask_ql_ql_al_hza")
see_more_links = driver.find_elements_by_css_selector("span.askShortText>a")
for link in see_more_links:
    link.click()
long_answer_texts = driver.find_elements_by_xpath("//span[@class='askLongText']")
for long_answer_text in long_answer_texts:
    print(driver.execute_script('return arguments[0].firstChild.textContent;', long_answer_text).strip())

控制台输出:

它们肯定有助于伸展脚趾。我希望避免一只脚上出现锤状趾,我不确定他们是否这样做,但我读到避免锤状趾出现的一种方法是伸展脚趾,所以我认为他们从长远来看会有所帮助,并且可能不会造成任何伤害。从一开始就没有伤到脚趾,所以我没有像某些人描述的那样有适应期。我每天都使用它们,我享受半小时或 45 分钟的平静和静止,而我所做的只是伸展我的脚趾。这也很有价值!

它们绝对会重新调整您的脚趾并拉直您的脚骨。您需要在开始时定期使用它们以使它们更直。在您的疼痛减轻一点后,您可以降低频率并延长佩戴时间。在过去的几周里,他们帮助我的拇囊炎变得不那么痛苦了。物有所值,而且绝对比手术好!!

我不知道要佩戴多久才能永久改善对齐。瑜伽脚趾非常有助于释放脚部和脚趾的紧张感,这确实改善了我的行走和平衡。因为我的一只脚已经长了拇囊炎,所以我怀疑这些有助于保持那只脚的对齐,但瑜伽脚趾可以帮助我的脚更好地适应那个拇囊炎。

【讨论】:

赞成!。一个 hacky、非通用的解决方案是替换子节点的文本。 print long_answer_text.text.replace('see less', '')【参考方案3】:

如果您想一次性获得所有答案,下面的脚本值得一试:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.amazon.com/ask/questions/Tx1AYFFVMESHMZV/ref=ask_ql_ql_al_hza")

for showmore in driver.find_elements_by_css_selector(".askSeeMore"):
    showmore.click()

for ans in driver.find_elements_by_css_selector("[id^='answer-']"):

    if "askLongText" in ans.get_attribute("class"):
        print(ans.find_element_by_css_selector(".askLongText").text)

    else:
        print(ans.find_element_by_css_selector("span").text)

driver.quit()

【讨论】:

【参考方案4】:

我已经调试了你的代码。下面提到的代码行:

answer = ans.find_element_by_css_selector('span.askLongText').text

抛出异常,因为元素 span 不只包含文本。 span 标签内有一个anchor 标签。要获取元素span 的全部内容,您必须使用.get_attribute('innerHTML')

您必须将代码行更改为:

answer = ans.find_element_by_css_selector('span.askLongText').get_attribute('innerHTML')

在答案中,您将获得span 元素的完整内容。

【讨论】:

这将获得span 标签中的整个innerHTML,这意味着&lt;a class="a-link-normal askSeeLess" href="#"&gt;\n see less\n &lt;/a&gt;\n 将与用户评论一起打印。抓取页面时不太理想 @GPT14:我的想法是使用提出问题的人的代码进行最小的更改,因此建议采用这种方法。【参考方案5】:

假设您既想要长答案又想要简短答案,并且您不想测试“查看更多”链接的功能......使用更复杂的定位器和一些 python 魔法,我们可以:

    返回长答案和短答案 跳过点击,让它运行得更快 从长答案中删除“少看”字符串

    修剪每个答案的开始和结束空格

    answers = driver.find_elements_by_css_selector("div[id^='answer'] > span:not([class]), div[id^='answer'] span.askLongText")
    for answer in answers:
        strings = driver.execute_script("return arguments[0].innerText", answer).splitlines()
        print([s.strip() for s in strings if s.strip()][0])
    

【讨论】:

以上是关于Python Selenium 找不到元素的主要内容,如果未能解决你的问题,请参考以下文章

Python Selenium 找不到元素

Selenium 使用 css、xpath、name、id (python) 找不到任何元素

PHPUnit + Selenium`InvalidArgumentException:找不到元素`

selenium学习之路3

带有 IE11 的 Selenium 3.0.1 在 Windows 10 上找不到元素(在带有 IE11 的 Windows 7 上运行良好)

python selenium找不到selenium库