【问题标题】:Can't scrape the text from class (BeautifulSoup)无法从课堂上刮取文字(BeautifulSoup)
【发布时间】:2018-10-20 22:51:37
【问题描述】:

我在使用乐透抽奖获取统计数据时遇到问题,我尝试了一堆不同的解析器,但每次返回的内容都是“无”

import requests
from bs4 import BeautifulSoup

url = "https://www.opap.gr/lotto-draw-results"
user = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
req = requests.get(url, headers = user)
soup = BeautifulSoup(req.text, "html.parser")
i = 1
while i <= 6:
    for draw_num in soup.findAll("li", {"class": "draw-result-number-{}".format(i)}):
        print(draw_num.content)
        i += 1

来自网站的一段 html 代码:

<ul class="circles"> <li class="draw-result-number-1">1</li> <li class="draw-result-number-2">2</li> <li class="draw-result-number-3">12</li> <li class="draw-result-number-4">14</li> <li class="draw-result-number-5">20</li> <li class="draw-result-number-6">49</li> <span class="plus_symbol" style="display: inline;">+</span> <li class="highlighted draw-result-number-bonus" style="display: inline-block;">8</li> </ul>

如果你能帮助我,我将不胜感激。

【问题讨论】:

  • 看到这个问题stackoverflow.com/questions/52910520/…,本质上是同样的问题——你试图用request打开一个webapp,request不能运行javascript
  • @RockyLi 我现在有点困惑,我以前从未使用过 selenium,你能帮我写代码吗?
  • 已回答,使用pip install selenium安装selenium包

标签: python web-scraping beautifulsoup


【解决方案1】:

从外观上看,数据并没有嵌入到 html 中,而是从附加的 API 调用中检索到的:

https://api.opap.gr/draws/v3.0/5103/last-result-and-active?status=results

您可以解析它以获得中奖号码:

import requests
req = requests.get("https://api.opap.gr/draws/v3.0/5103/last-result-and-active?status=results")
data = req.json() 
print(data["last"]["winningNumbers"])

似乎url路径是静态的,在JS中它是动态构建url,5103表示它是Lotto游戏,见this file

【讨论】:

  • 这很好用,但是没有办法直接从 html 中获取这些数字?我想从同一站点的其他游戏中获取号码。
  • @PrzemekRzepa 如果您查看我链接的 JS 文件,每个游戏都有一个代码 5103 用于“Lotto”,2100 用于“Super3”,1100 用于“Kino”等。 .. 例如 Kino:api.opap.gr/draws/v3.0/1100/…
  • 我明白了,但是我怎样才能从最近 20 次 kino 抽签中获取结果?
【解决方案2】:

以下是selenium 在您的情况下的用法:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time

options = webdriver.ChromeOptions()
options.add_argument('headless')
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(chrome_options=options, desired_capabilities=capa)
driver.set_window_size(1440,900)
driver.get('https://www.opap.gr/lotto-draw-results')
time.sleep(15) # wait for the website to load in selenium process

plain_text = driver.page_source
soup = BeautifulSoup(plain_text, 'lxml')

你的所有元素都将包含在汤中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多