3 votes

Selenium Web Scrapping avec une belle soupe sur le contenu dynamique et le tableau de données cachées

J'ai vraiment besoin de l'aide de cette communauté !

Je fais du web scraping sur du contenu dynamique en Python en utilisant Selenium et Beautiful Soup. Le problème est que le tableau de données de prix ne peut pas être analysé en Python, même en utilisant le code suivant :

html=browser.execute_script('return document.body.innerHTML')
sel_soup=BeautifulSoup(html, 'html.parser')  

Cependant, j'ai découvert plus tard que si je clique sur le bouton "Voir tous les prix" sur la page Web avant d'utiliser le code ci-dessus, je peux analyser ce tableau de données en python.

Ma question est la suivante : comment puis-je analyser et accéder à ces informations dynamiques cachées dans mon python sans utiliser Selenium pour cliquer sur tous les boutons "Voir tous les prix", parce qu'il y en a tellement.

L'url du site web sur lequel je fais du scrapping web est la suivante https://www.cruisecritic.com/cruiseto/cruiseitineraries.cfm?port=122 , et l'image ci-jointe est le html en termes de tableau de données dynamique dont j'ai besoin. entrer la description de l'image ici

J'apprécie vraiment l'aide de cette communauté !

4voto

Eduard Florinescu Points 1586

Vous devez cibler l'élément après qu'il a été chargé et prendre arguments[0] et non la page entière via document

html_of_interest=driver.execute_script('return arguments[0].innerHTML',element)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')

Il y a deux cas pratiques :

1

l'élément n'est pas encore chargé dans le DOM et vous devez attendre l'élément :

browser.get("url")
sleep(experimental) # usually get will finish only after the page is loaded but sometimes there is some JS woo running after on load time

try:
    element= WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'your_id_of_interest')))
    print "element is ready do the thing!"
    html_of_interest=driver.execute_script('return arguments[0].innerHTML',element)
    sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
except TimeoutException:
    print "Somethings wrong!"   

2

l'élément est dans une racine fantôme et vous devez d'abord développer la racine fantôme, ce qui n'est probablement pas votre cas, mais je le mentionne ici car c'est pertinent pour une référence future. ex :

import selenium
from selenium import webdriver
driver = webdriver.Chrome()
from bs4 import BeautifulSoup

def expand_shadow_element(element):
  shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
  return shadow_root

driver.get("chrome://settings")
root1 = driver.find_element_by_tag_name('settings-ui')

html_of_interest=driver.execute_script('return arguments[0].innerHTML',root1)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
sel_soup# empty root not expande

shadow_root1 = expand_shadow_element(root1)

html_of_interest=driver.execute_script('return arguments[0].innerHTML',shadow_root1)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
sel_soup

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X