Python Selenium找不到元素

时间:2018-05-29 00:41:55

标签: python selenium web-scraping amazon

我正试图抓一些亚马逊的问题和答案,特别是这个: 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类。我稍后会处理异常但是没有把它放在这里用于测试目的。无论哪种方式,前三个元素确实包含这样的类,其内容应该打印,但这不会发生

5 个答案:

答案 0 :(得分:2)

这对我有用。

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分钟,而我所做的只是伸展我的脚趾。这值得   也是一件事!

     

他们绝对会重新调整你的脚趾并矫正你的脚骨。   您需要在开始时定期使用它们来设置它们   直。在你的疼痛减轻一点后,你可以降低疼痛   频率和延长你穿的时间。他们帮了我   在过去几周里,拇囊炎的痛苦程度要小得多。好   值得$ IMO,绝对比手术好!!

     

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

答案 1 :(得分:1)

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

代码块:

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分钟,而我所做的只是伸展脚趾。这也是值得的!

     

他们绝对会重新调整你的脚趾并矫正你的脚骨。您需要在开始时定期使用它们以将它们设置得更直。疼痛消退后,您可以降低频率并延长佩戴时间。在过去的几周里,他们帮助我的拇囊炎变得更加痛苦。非常值得$ IMO,绝对比手术好!!

     

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

答案 2 :(得分:0)

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

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()

答案 3 :(得分:0)

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

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

抛出异常,因为元素span并不仅包含文本。 anchor标记中有span个标记。要获取元素span的完整内容,您必须使用.get_attribute('innerHTML')

您必须将代码行更改为:

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

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

答案 4 :(得分:0)

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

  1. 返回长句和短答案
  2. 跳过点击以便更快地运行
  3. 从长答案中删除“看不到”字符串
  4. 修剪开始和结束空白的每个答案

    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])