Selenium не может найти сгенерированные JavaScript элементы

1

Итак, что я хочу сделать, это запустить браузер, получить содержимое страницы (с помощью рендеринга JavaScript) и найти элемент, который я хочу использовать BeautifulSoup, здесь мой код:

from selenium import webdriver
from bs4 import BeautifulSoup as bs4
from selenium.webdriver.support.ui import WebDriverWait

browser = webdriver.Edge()
browser.get('https://www.premierleague.com/match/22721')
element = WebDriverWait(browser, 10)
html=bs4(browser.page_source,'html.parser')
print(html.body.main.find('div',attrs={'class':'mcTabs'}))

browser.quit()

Я получаю None из инструкции print

  • 0
    В чем именно проблема, которую вы испытываете? Вы получаете исключение или неожиданный вывод? Попытайтесь быть более точным в том, что вам нужно помочь.
  • 0
    Я просто не получаю элемент, который мне нужен, из оператора print, похоже, JavaScript не выполняется.
Показать ещё 1 комментарий
Теги:
selenium

1 ответ

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

Прежде всего, у вас есть опечатка в вашем коде:

print(html.body.main.find('div',attrs='class':'mcTabs'}))

следует заменить на:

print(html.body.main.find('div',attrs={'class':'mcTabs'})) # { is missing

Второе:

element = WebDriverWait(browser, 10)

является избыточным, поскольку вы нигде не используете element.

И теперь к самому вопросу. Я не очень хорошо знаком с BeautifulSoup, но я нашел следующее:

browser.get('https://www.premierleague.com/match/22721')
# wait for element to be present
WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.mcTabs"))) 
# get page source when element is already present
html = bs4(driver.page_source,'html.parser')
print(html.body.main.find('div', attrs={'class':'mcTabs'}).prettify())

Объяснение: вы получаете page_source документа, который еще не готов, поэтому вам нужно подождать, пока div.mcTabs не будет присутствовать в DOM и только затем получите page_source.

Выход:

<div class="mcTabs">
 <section class="mcLatestContainer mcMainTab active" data-ui-args='{"type": "latest"}' data-ui-tab="Latest">
  <nav class="tabs" data-built-class="matchLatestContainer" data-script="pl_tabbed" data-tab-class="mcLatestTab" data-tab-wrap=".tabs" data-widget="tabbed-content">
  </nav>
  <div class="matchLatestContainer">
   <nav class="tabs">
    <ul class="tablist" role="tablist">
     <li class="active" data-tab-index="0" role="tab" tabindex="0">
      Latest
     </li>
     <li data-tab-index="1" role="tab" tabindex="0">
      Photos
     </li>
    </ul>
   </nav>
   <div class="blogStreamMatchContainer mcLatestTab active" data-tab-aware-default="true" data-ui-tab="Latest">
    <div class="preMatchContainer" style="display: none;">
     <div class="matchPreviewStreamContainer">
     </div>
     <p class="noContentAvailableContainer" style="display: none;">
      No Content Available
     </p>
    </div>
    <div class="liveMatchContainer" style="">
     <section class="matchBlog">
      <div class="wrapper">
       <div class="mcBlogStream">
        <div class="matchReportStreamContainer" data-report-rendered="true">
         <header>
          <h3 class="subHeader">
           Match summary
          </h3>
         </header>
         <div class="wrapper col-12">
          <div class="standardArticle">
           <p>
            Manuel Lanzini scored twice as West Ham United finished the season with a 3-1 win over Everton.
           </p>
           <p>
            The midfielder opened the scoring from the edge of the area on 39 minutes after latching on to Marko Arnautovic flick of a Cheikhou Kouyate pass.
           </p>
           <p>
            Arnautovic doubled the lead in the 63rd minute with a fierce shot for his 11th goal of the season.
           </p>
...
  • 1
    Большое спасибо, я новичок во всем этом, задавая вопросы. В любом случае, ваш код мне очень помог, есть хороший

Ещё вопросы

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