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
,这意味着<a class="a-link-normal askSeeLess" href="#">\n see less\n </a>\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 找不到元素的主要内容,如果未能解决你的问题,请参考以下文章
Selenium 使用 css、xpath、name、id (python) 找不到任何元素
PHPUnit + Selenium`InvalidArgumentException:找不到元素`
带有 IE11 的 Selenium 3.0.1 在 Windows 10 上找不到元素(在带有 IE11 的 Windows 7 上运行良好)