Python Selenium не может найти элемент - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь отсканировать некоторые вопросы и ответы 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 голосов
/ 30 мая 2018

Предполагая, что вам нужны как длинные, так и короткие ответы, и что вы не пытаетесь проверить функциональность ссылки "посмотреть больше" ... с более сложным локатором и некоторой магией 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])
    
0 голосов
/ 29 мая 2018

@ Ответ 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, и определенно лучше, чем операция !!

Я не знаю, как долго придется их носить, чтобы навсегда улучшить выравнивание.Пальцы йоги очень помогают в снятии напряжения стопы и ног, и это улучшает ходьбу и баланс для меня.Поскольку у меня уже есть бугорок на одной ноге, я сомневаюсь, что это поможет сохранить равновесие в этой ноге, но пальцы йоги помогают моим ногам лучше адаптироваться к этому бугорку.

0 голосов
/ 29 мая 2018

Если вы хотите получить все ответы за один раз, стоит попробовать следующий скрипт:

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()
0 голосов
/ 29 мая 2018

Я отладил ваш код.Строка кода, упомянутая ниже:

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.

0 голосов
/ 29 мая 2018

Это сработало для меня.

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, и определенно лучше, чем операция !!

Я не знаю, как долго придется их носить, чтобы навсегда улучшить выравнивание.Пальцы йоги очень помогают в снятии напряжения стопы и ног, и это улучшает ходьбу и баланс для меня.Поскольку у меня уже есть бугорок на одной ноге, я сомневаюсь, что это поможет сохранить равновесие в этой ноге, но пальцы йоги помогают моим ногам лучше адаптироваться к этому бугорку.

...