使用 BeautifulSoup 抓取时如何解决加倍问题

问题描述

我的脚本有一个奇怪的问题,它从网页中提取了一些日期。

这是脚本:

# import library
import json
import re
import requests
from bs4 import BeautifulSoup
import datetime

# Request to website and dowload HTML contents
url = 'https://www.coteur.com/cotes-basket.PHP'

#page = requests.get(url)
response = requests.get(url)

#soup = BeautifulSoup(page.text,'html.parser')
soup = BeautifulSoup(response.text,'html.parser')

s = soup.find("table",id="mediaTable").find_all('script',type='application/ld+json')
date_hour = [json.loads(re.search(r'>(.+)<',str(j),re.S).group(1))["startDate"] for j in s]
#print(date_hour)
date_hour = [sub.replace("T"," ") for sub in date_hour]
print(len(date_hour))
print(date_hour)

代码有效。它返回标记脚本内的 startDate 元素。 但是有一个日期加倍(在网页中,我计算了 24 个篮子事件,但我的列表长度为 25)。在网页中,您可以看到 3 个从 00:00 开始的事件,但我的脚本使用 00:00

提取了 4 个日期

也许您知道为什么网站不显示这些额外的条目?

解决方法

也许你知道为什么网站不显示这些额外的 条目?

它不会显示没有赔率的地方。这是由于脚本运行并从视图中删除了那些没有赔率的情况。我认为目前这是由 script:nth-child(25) 标识的脚本,它以 $(document).on('click' 开头...。这对odds.length 进行了测试,如果为 0,则行删除。

您可以通过禁用 javascript 并重新加载页面来进行测试。您将获得与您的 python 请求相同的结果(其中 js 不运行)。该行存在。重新启用js,该行就会消失。

您可以通过转到 Recontres(主桌)查看给定比赛的赔率 > Cotes(另见预测)。如果您在禁用 js 的情况下执行此操作,您可以按照所有比赛的 Recontres 链接查看是否有赔率。在预测中,应该有基于赔率的计算,而不是两者都为 0。

如何解决用 BeautifulSoup 抓取时出现翻倍的问题?

无法根据您使用 requests 获得的响应来区分页面上将丢失的行。我不确定您甚至可以提出额外的请求来检查赔率信息,因为所有没有 js 的人都缺少它。您可能需要切换到 selenium/浏览器自动化。这样你就根本不需要 BeautifulSoup 了。

有很小的外部机会,您可能会发现 API/其他站点的可能性相同,并且您可以交叉引用。


相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...