J'essaie de gratter un site Web qui fournit des flux en direct pour trouver le lien .m3u8 du flux, ce que je vois lorsque j'inspecte la page Web sur Chrome est quelque chose comme ça

<div class="video-box"> 
    <div id="player"> 
        <div id="still_video_container">
            <div id="still_video2">
                <div tabindex="1">
                    <video id ="still_video">
                        <source src="link to m3u8">
                        </source>
                    </video>
                </div>
            </div>
        </div>
    </div>
</div>

c'est mon script actuel

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
uClient = uReq(url)

page_html = uClient.read()
uClient.close()

#parsing
page_soup = soup(page_html, "html.parser")
containers = page_soup.find_all("video", {"id":"still_video"})
print(len(containers))
print(containers)

lorsque je recherche la balise "video", une liste vide est renvoyée et la balise n'est pas trouvée, idem pour div id = "still_video". Si je recherche div id = "still_video_container", une liste avec un seul élément (la chaîne du div) est renvoyée. Pourquoi soup.find_all ne peut pas entrer dans cette div? Comment puis-je accéder à l'identifiant vidéo du tag? semble caché.

De plus, actuellement, je reçois le lien m3u8 avec ce script, qui a simplement renvoyé le lien correct, mais je voudrais éviter l'utilisation de sélénium et utiliser uniquement BeautifulSoup

browser=webdriver.Chrome(executable_path=r'path-to-chromedriver.exe')
browser.get(url)
link_m3u8 = browser.find_element_by_tag_name("source").get_attribute("src")
browser.quit()
0
james 6 nov. 2019 à 02:45

1 réponse

Votre find_all () semble bien fonctionner. Vous pouvez exécuter le code suivant et voir comment cela fonctionne:

from bs4 import BeautifulSoup as soup

content = '<div class="video-box"> \
   <div id="player"> \
        <div id="still_video_container">\
            <div id="still_video2">\
                <div tabindex="1">\
                    <video id ="still_video">\
                        <source src="link to m3u8">\
                        </source>\
                    </video>\
                </div>\
            </div>\
        </div>\
    </div>\
</div>'

#parsing
page_soup = soup(content)
containers = page_soup.find_all("video", {"id":"still_video"})
print(len(containers))
print(containers)

Assurez-vous de télécharger le texte avec la balise vidéo à l'intérieur. Convertissez simplement votre page_html en texte (contenu) et faites quelque chose comme:

print(content)
page_soup = soup(content)

# code to parse content below
0
Anatoliy R 6 nov. 2019 à 00:33