我正在使用以下代碼從強力球網站上洗掉數字。然而,數字總是空的。為什么是這樣?
import requests
from bs4 import BeautifulSoup
url = 'https://www.powerball.com/games/home'
page = requests.get(url).text
bsPage = BeautifulSoup(page)
numbers = bsPage.find_all("div", class_="field_numbers")
numbers
uj5u.com熱心網友回復:
如果您下載該檔案并在本地檢查它,您可以看到<div>該類沒有。這意味著它很可能是由您的瀏覽器使用 javascript 動態生成的,因此您需要使用 selenium 之類的東西來獲取完整的生成的 HTML 內容。
無論如何,在這種特定情況下,這段 HTML 似乎是您要查找的資料的容器:
<div data-url="/api/v1/numbers/powerball/recent?_format=json" class="recent-winning-numbers"
data-numbers-powerball="Power Play" data-numbers="All Star Bonus">
現在,如果您檢查該 custom data-url,您可以找到 JSON 格式的所需資訊。
uj5u.com熱心網友回復:
可以確認@Teprr 絕對正確。您需要下載 chrome并將chromedriver.exe添加到您的系統路徑才能使其正常作業,但以下代碼可以獲得您要查找的內容。您也可以使用其他瀏覽器,您只需要它們各自的驅動程式。
from bs4 import BeautifulSoup
from selenium import webdriver
import time
url = 'https://www.powerball.com/games/home'
options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome(options=options)
browser.get(url)
time.sleep(3) # wait three seconds for all the js to happen
html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')
draws = soup.findAll("div", {"class":"number-card"})
print(draws)
for d in draws:
info = d.find("div",{"class":"field_draw_date"}).getText()
balls = d.find("div",{"class":"field_numbers"}).findAll("div",{"class":"numbers-ball"})
numbers = [ball.getText() for ball in balls]
print(info)
print(numbers)
uj5u.com熱心網友回復:
url 包含的動態含義資料是由 JavaScript 生成的,BeautifulSoup 無法呈現 javaSceipt。所以,您需要像 selenium 這樣的自動化工具和 BeautifulSoup。請運行代碼。
from bs4 import BeautifulSoup
import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
url = 'https://www.powerball.com/games/home'
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.maximize_window()
driver.get(url)
time.sleep(20)
soup = BeautifulSoup(driver.page_source, 'html.parser')
#driver.close()
numbers =soup.select('.field_numbers > div')
for number in numbers:
print(number.text)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/445084.html
下一篇:如何在呼叫時停止函式?
