使用 BeautifulSoup 从网页中提取内容

Extracting content from webpage using BeautifulSoup

我正在使用以下代码从 Powerball 网站上抓取号码。 但是,数字总是空着。这是为什么?

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

如果您下载该文件并在本地检查它,您可以看到没有 <div> 和那个 class。这意味着它可能是由您的浏览器使用 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">

现在,如果您检查自定义 data-url,您可以找到您想要的 JSON 格式的信息。

可以确认@Teprr 是绝对正确的。你需要 download chrome and add 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)