Как вставить текст в класс div с помощью селена

1

Я хочу получить текст Life of Pi из html-кода ниже. Я пробовал много разных вариантов поиска, но ни один из них, похоже, не нашел правильный div или не смог извлечь текст, который я хочу получить из html-кода.

Я пытался:

movie_name = browser.find_element_by_class_name("_14Rip")
movie = movie_name.get_attribute('text')

movie_name = browser.find_element('_14Rip').getText()

Ни один из них не работал. Также.getText вызвал ошибку в отношении объекта "WebElement". Мне было интересно, как я могу извлечь этот текст, используя python и selenium?

<div id="reactApp"><div data-reactroot=""><!-- react-empty: 2 --><!-- react-empty: 3 --><div class="nr-medium-page main-page-container"><span><div class="_1gHrf"></div><nav class="_2ng5l"><div class="_1nd6r"><span class="_3Jg52 _2Dfpe"><a href="/content/movies/home"><span class="_2RaqC "></span></a></span><span><span class="_3Jg52 _2Dfpe"><span class="_1sHRG"><a href="/content/movies/movieslist">Movies</a></span></span><div class="_34DjI" style="opacity: 0; top: 0px; transform: translateY(-100%); z-index: 1; left: 116.875px;"><div class="_3kwAy nr-m-30"><div class="_2h_ha"><a href="/content/movies/movieslist">VIEW ALL MOVIES</a></div><div><div class="_223L6"></div></div></div></div></span><span><span class="_3Jg52 _2Dfpe"><span class="_1sHRG"><a href="/content/movies/tvlist">TV</a></span></span><div class="_34DjI" style="opacity: 0; top: 0px; transform: translateY(-100%); z-index: 1; left: 180.974px;"><div class="_3kwAy nr-m-30"><div class="_2h_ha"><a href="/content/movies/tvlist">VIEW ALL TV</a></div><div><div class="_223L6"></div></div></div></div></span><span><span class="_3Jg52 _2Dfpe"><span class="_1sHRG"><a href="/content/movies/myvudu">My Vudu</a></span></span><div class="_34DjI" style="opacity: 0; top: 0px; transform: translateY(-100%); z-index: 1; left: 252.224px;"><div class="ZvRao"><a href="/content/movies/mymovies">My Movies</a><a href="/content/movies/mytv">My TV</a><a href="/content/movies/mywishlist">My Wishlist</a><a href="/content/movies/mypreorders">My Pre-orders</a><a href="/content/movies/myoffers">My Offers</a></div></div></span><span><span class="_3Jg52 _2Dfpe"><span class="_1sHRG"><a href="/content/movies/free">Free</a></span></span><div class="_34DjI" style="opacity: 0; top: 0px; transform: translateY(-100%); z-index: 1; left: 349.104px;"><div class="_3kwAy nr-m-30"><div class="_2h_ha"><a href="/content/movies/free">VIEW ALL FREE MOVIES &amp; TV</a></div><div><div class="_223L6"></div></div></div></div></span><span class="_3Jg52 _2Dfpe _3uvRn"><span class="kzzv5"><span class="_1sHRG"><span class="_72isQ"></span></span></span></span><span><span class="_3Jg52 _2Dfpe _3uvRn _28Da_ _18Vtj"><span class="_1sHRG"><span><div><div class="_3yhAh"><span class="glyphicon glyphicon-user"></span></div><div class="_3p4_i"><!-- react-text: 71 -->Hi, Zachary!<!-- /react-text --></div></div></span></span></span><div class="_34DjI" style="opacity: 0; top: 0px; transform: translateY(-100%); z-index: 1; left: 1035px;"><div class="ZvRao"><a href="https://www.vudu.com/content/AccountManage.html#accountInfo">Account Settings</a><a href="javascript:void(0);">Payment Info</a><a href="https://www.vudu.com/content/AccountManage.html#balanceHistory">Balance &amp; History</a><a href="https://www.vudu.com/content/MyDevices.html">Manage Devices</a><a href="http://support.vudu.com/?supportPage=home">Support</a><a href="javascript:void(0);">Log Out</a></div></div></span><span><span class="_3Jg52 _2Dfpe _3uvRn _28Da_ _18Vtj"><span class="_1sHRG"><span>Redeem</span></span></span><div class="_34DjI _231pT" style="opacity: 0; top: 0px; transform: translateY(-100%); z-index: 1; left: 509.88px;"><div class="ZvRao"><a href="https://www.vudu.com/content/redeem.html">Digital Copy</a><a href="https://www.vudu.com/vuducodes">Vudu Code</a></div></div></span></div></nav></span><div class="nr-page-body"><div><div class="_2vzt3"></div><div class="_1_90a"><div class="_36fun"><div class="container nr-width-100 nr-mt-20 nr-p-0"><div class="row"><div class="col-xs-12"><div class="_11CIH nr-mr-20"><button class="_3wvTg _1PvrS _2WUnj _2Jfzj"><span class="_2O7IK"><span class="_6D7oD">Filters</span><span class="_29qeU"><span class="glyphicon glyphicon-triangle-bottom"></span></span></span></button></div></div></div></div><div class="page-section nr-mt-10 nr-pt-20 sb-t2"></div><div class="_3oON0"><div class="_1RtHb"><div class="ki1tU" style="width: calc(34% - 0px);">Recently Purchased</div><div style="width: calc(34% - 0px);">A - Z</div><div style="width: calc(34% - 0px);">Release Date</div></div></div><!-- react-empty: 150 --></div></div><div class="mLd3t"><div class="_2qGVw "><span>My Movies</span><span><!-- react-text: 155 -->&nbsp;(<!-- /react-text --><!-- react-text: 156 -->124<!-- /react-text --><!-- react-text: 157 -->)<!-- /react-text --></span></div><div><div style="position: fixed; width: 100%; left: 0px; top: 253.333px; z-index: 2;"><div style="overflow: hidden; width: 100%;"><div class="nr-pt-40" style="max-height: 1156px; overflow-y: scroll; width: 100%; height: 324.667px; padding-left: calc(50% - 314px);"><div style="position: relative; min-height: 7347px; width: 628px;"><div class="contentPosterWrapper" style="width: 142px; height: 237px; left: 0px; top: 0px; position: absolute; z-index: 2;"><div class="_1-zjZ"><a href="/content/movies/details/The-Social-Network/182239"><div class="_3YJBG  content-poster"><div class="_1witT"><span class="_2KzEp"><div class="_1LPN- _3YCP4"><img src="https://images2.vudu.com/poster2/182239-142" alt="The Social Network"></div></span></div><div class="_20xkP"></div></div></a></div></div><div class="contentPosterWrapper" style="width: 142px; height: 237px; left: 162px; top: 0px; position: absolute; z-index: 2;"><div class="_1-zjZ"><a href="/content/movies/details/Snatch/21789"><div class="_3YJBG  content-poster"><div class="_1witT"><span class="_2KzEp"><div class="_1LPN- _3YCP4"><img src="https://images2.vudu.com/poster2/21789-142" alt="Snatch"></div></span></div><div class="_20xkP"></div></div></a></div></div><div class="contentPosterWrapper" style="width: 142px; height: 237px; left: 324px; top: 0px; position: absolute; z-index: 2;"><div class="_1-zjZ"><a href="/content/movies/details/Life-of-Pi/391851"><div class="_3YJBG dkbEJ content-poster"><div class="_1witT"><span class="_2KzEp"><div class="_1LPN- _3YCP4"><img src="https://images2.vudu.com/poster2/391851-142" alt="Life of Pi"></div></span></div><div class="_20xkP dkbEJ"><div class="_1KXuV"><div class="_2QBtI _1kJwC"><div class="_1yDEt _33qR9 _4mlb1 _25_Pp"><div class="_14Rip"><!-- react-text: 464 -->Life of Pi<!-- /react-text --><!-- react-text: 465 --> <!-- /react-text --></div></div><div class="_33qR9 "><span class="_2kH_h">2012</span><span class="_2kH_h"><span class="_2W2ik ">PG</span></span><span class="_2kH_h"><span class="_35HrQ BE5VD"></span></span><span class="_2kH_h"><span class="Xmp5C gLWM-"></span></span></div>

Если я попробую только.text, я также получу эту ошибку:

File "C:\Users\\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\Users\\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: invalid argument: 'value' must be a string
  • 0
    Можете ли вы поделиться URL, чтобы мы могли проверить?
  • 0
    URL-адрес является частью веб-сайта, для которого требуется информация для входа, есть ли лучший способ, чтобы вы могли проверить?
Показать ещё 1 комментарий
Теги:
python-3.x
selenium
selenium-webdriver
google-chrome

4 ответа

1
Лучший ответ

Первая попытка:

.get_attribute('text') недействителен и Element.text только для видимого текста, попробуйте использовать атрибут 'textContent'

movie_name = browser.find_element_by_class_name("_14Rip")
movie = movie_name.get_attribute('textContent')

Вторая попытка:

Из вашего HTML выше есть только один класс _14Rip но у него есть 3 фильма, может ли он быть добавленным только при его зависании? но попробуйте альтернативный метод, извлекая название фильма с помощью alt image и добавляя WebDriverWait

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

.....
.....
# put this after login or clicking login button
# wait max 30 second
WebDriverWait(browser, 30).until(
           EC.presence_of_element_located((By.CSS_SELECTOR, "span[class="_2KzEp"] img")))
movie_names = browser.find_elements_by_css_selector("span[class="_2KzEp"] img")
for name in movie_names:
    print(name.get_attribute('alt'))
1

Вы также можете использовать селектор CSS с атрибутом = значение в сочетании с селектором элементов. Это предполагает, что вы хотите, чтобы первый элемент div соответствовал этому имени класса. Вы бы использовали find_elements, если более одного, и вам нужен был более поздний. Затем вы должны индексировать эту коллекцию, чтобы вернуть соответствующее совпадение. Совместное использование большего количества HTML/URL-адресов поможет улучшить это.

print(browser.find_element_by_css_selector("div[class='_14Rip']").text)
  • 0
    Попытка этого вызывает selenium.common.exceptions.NoSuchElementException: Сообщение: нет такого элемента: Невозможно найти элемент: {"method": "css selector", "selector": "._ 14Rip"}
  • 0
    Попробуйте div [class = '_ 14Rip'] и у вас достаточно времени на загрузку страницы, и вам нужно прокручивать элемент в поле зрения?
Показать ещё 8 комментариев
0

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

Я использовал.find_elements_by_xpath, потому что он дал мне право на изображение, у которого был текстовый атрибут, который я хотел. Селектор css рекомендовал также бросить ошибки, говоря, что он не смог найти элемент. Казалось, что проблема связана с диапазоном. Еще раз спасибо всем, кто помог мне найти решение!

# Used to get the movie names from the webpage
# If the page loads as you scroll down you would need to loop through this code

movie_list = []

movie_names = browser.find_elements_by_xpath('//*[@id="reactApp"]/div/div/div/div/div[3]/div[2]/div/div/div/div/div[1]/div/a/div/div[1]/span/div/img')

for name in movie_names:
        # Add movie name to list
        movie = name.get_attribute('alt')
        movie_list.append(movie)
0

getText() - это метод Java. Вы ищете text члена. Вам также нужно сообщить драйверу, как его найти, by_class_name в вашем случае

movie_name = browser.find_element_by_class_name('_14Rip').text

Вы также можете найти использование класса By

from selenium.webdriver.common.by import By

browser.find_element((By.CLASS_NAME, '_14Rip'))
  • 0
    Извините, я редактировал, я забыл добавить, что когда я пытаюсь .text, я также получаю сообщение о том, что у меня неверный аргумент, это значение должно быть строкой. Мне было интересно, если из-за того, где текст .text не может найти его правильно?
  • 1
    @ZacharyRW Обновил мой ответ.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню