BeautifulSoup не находит таблицы на веб-странице

#python #selenium #iframe #beautifulsoup #webdriverwait

#python #селен #iframe #beautifulsoup #webdriverwait

Вопрос:

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

Я пробовал:

 from bs4 import BeautifulSoup  
from selenium import webdriver  
driver = webdriver.Chrome('C:\folder\chromedriver.exe')  
url = 'https://learn.microsoft.com/en-us/windows/release-information/'  
driver.get(url)  

tbla = driver.find_element_by_name('table') #attempt using by element name  
tblb = driver.find_element_by_class_name('cells-centered') #attempt using by class name  
tblc = driver.find_element_by_xpath('//*[@id="winrelinfo_container"]/table[1]') #attempt by using xpath  
  

и попытался использовать beautiful soup

 html = driver.page_source
soup = BeautifulSoup(html,'html.parser')
table = soup.find("table", {"class": "cells-centered"})
print(len(table))
  

Любая помощь очень ценится.

Ответ №1:

Таблица присутствует внутри iframe , и вам нужно сначала переключиться iframe , чтобы получить доступ к table .

Вызовите WebDriverWait() и дождитесь frame_to_be_available_and_switch_to_it () и следующего локатора.

Вызовите WebDriverWait() и дождитесь visibility_of_element_located () и следующего локатора.

 driver.get("https://learn.microsoft.com/en-us/windows/release-information/")
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"winrelinfo_iframe")))
table=WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"table.cells-centered")))
  

Вам необходимо импортировать библиотеки ниже.

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

Или вы используете приведенный ниже код с xpath помощью .

 driver.get("https://learn.microsoft.com/en-us/windows/release-information/")
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"winrelinfo_iframe")))
table=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,'//*[@id="winrelinfo_container"]/table[1]')))
  

Вы можете дополнительно импортировать данные таблицы в pandas dataframe, а затем экспортировать в файл csv.Вам нужно импортировать pandas.

 driver.get("https://learn.microsoft.com/en-us/windows/release-information/")
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"winrelinfo_iframe")))
table=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,'//*[@id="winrelinfo_container"]/table[1]'))).get_attribute('outerHTML')
df=pd.read_html(str(table))[0]
print(df)
df.to_csv("path/to/csv")
  

Импорт панд: pip install pandas

Затем добавьте нижеприведенную библиотеку

 import pandas as pd
  

Комментарии:

1. Ах, iframe… так много еще предстоит узнать :-), это именно то, что мне было нужно, мой следующий шаг — создать df с данными, которые будут импортированы в базу данных SQL, так что это идеально, большое спасибо @KunduK, очень признателен!!

Ответ №2:

Таблица находится внутри <iframe> , поэтому BeautifulSoup не видит ее внутри исходной страницы:

 import requests 
from bs4 import BeautifulSoup


url = 'https://learn.microsoft.com/en-us/windows/release-information/'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
soup = BeautifulSoup(requests.get(soup.select_one('iframe')['src']).content, 'html.parser')

for row in soup.select('table tr'):
    print(row.get_text(strip=True, separator='t'))
  

С принтами:

 Version Servicing option    Availability date   OS build    Latest revision date    End of service: Home, Pro, Pro Education, Pro for Workstations and IoT Core End of service: Enterprise, Education and IoT Enterprise
2004    Semi-Annual Channel 2020-05-27  19041.546   2020-10-01  2021-12-14  2021-12-14  Microsoft recommends
1909    Semi-Annual Channel 2019-11-12  18363.1110  2020-09-16  2021-05-11  2022-05-10
1903    Semi-Annual Channel 2019-05-21  18362.1110  2020-09-16  2020-12-08  2020-12-08
1809    Semi-Annual Channel 2019-03-28  17763.1490  2020-09-16  2020-11-10  2021-05-11
1809    Semi-Annual Channel (Targeted)  2018-11-13  17763.1490  2020-09-16  2020-11-10  2021-05-11
1803    Semi-Annual Channel 2018-07-10  17134.1726  2020-09-08  End of service  2021-05-11

...and so on.
  

Комментарии:

1. это также решает проблему, спасибо за вашу помощь, очень ценю это