ich habe ein Problem mit dem Scraping von JavaScript-generierten HTML-Elementen.
Wenn ich den HTML-Quelltext anschaue, steht das darin:
(ein Auszug)
Code: Alles auswählen
<div class="other_item"></div>
<div class="recomend">
<h4>Recommend items</h4>
<div class="recommend_edi"></div>
<div class="recommend_aix"></div>
</div>
<div class="recomend">
<h4>Other items from this category</h4>
<div class="recommend_same_category thumsmall"></div>
</div>

Wie man sehen kann, bedeutend mehr.
Jetzt meine Frage. Wie kann ich die Inhalte auslesen?
Habe bereits folgendes probiert:
1. selenium:
Code: Alles auswählen
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = Service('C:\Webdrivers\chromedriver.exe')
service.start()
driver = webdriver.Remote(service.service_url)
driver.get('url zensiert')
Das liegt daran, dass der Browser den Erfolg des Ladens zurück meldet, obwohl das Generieren über JS noch nicht abgeschlossen ist.
Je nach Timing habe ich von den generierten Elementen zwischen 0 und 100% verfügbar.
Darum kann ich nicht darauf vertrauen.
Ich weiß auch nicht, wie ich die Wartezeit verlängern kann. Der Browser sendet "fertig" zurück, obwohl die JS-Elemente noch nicht fertig generiert wurden.
2. requests_html:
Code: Alles auswählen
from bs4 import BeautifulSoup
from requests_html import HTMLSession
session = HTMLSession()
resp = session.get('url zensiert')
resp.html.render()
soup = BeautifulSoup(resp.html.html, 'lxml')
3. PyQt5
Code: Alles auswählen
from bs4 import BeautifulSoup
from requests_html import HTMLSession
import requests
import time
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEnginePage
class Page(QWebEnginePage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebEnginePage.__init__(self)
self.loadFinished.connect(self.on_load_finished)
self.load(QUrl(url))
self.app.exec_()
def on_load_finished(self):
self.html = self.toHtml(self.Callable)
print('Load Finished')
def Callable(self, html_str):
self.html = html_str
self.app.quit()
page = Page('url zensiert')
soup = BeautifulSoup(page.html, 'lxml')
Ich hoffe mir kann jemand dabei helfen

Grüße
TenchiMuyo1984