使用Python和beautifulsoup进行Web抓取:beautifulsoup函数保存了什么?

使用Python和beautifulsoup进行Web抓取:beautifulsoup函数保存了什么?,python,beautifulsoup,Python,Beautifulsoup,这个问题紧随其后。我想使用Python从一个博彩网站上抓取数据。我第一次尝试这样做,但问题是该网站无法从瑞士获得。因此,我选择了另一个博彩网站:Winamax。在本教程中,首先检查该网页,以便在html文件中找到投注率的位置。在tipico网页中,它们存储在“c_but_base c_but”类的按钮中。通过编写以下行,可以使用Beauty soup模块保存和打印费率: from bs4 import BeautifulSoup import urllib.request import re

这个问题紧随其后。我想使用Python从一个博彩网站上抓取数据。我第一次尝试这样做,但问题是该网站无法从瑞士获得。因此,我选择了另一个博彩网站:Winamax。在本教程中,首先检查该网页,以便在html文件中找到投注率的位置。在tipico网页中,它们存储在“c_but_base c_but”类的按钮中。通过编写以下行,可以使用Beauty soup模块保存和打印费率:

from bs4 import BeautifulSoup
import urllib.request
import re

url = "https://www.tipico.de/de/live-wetten/"

try:
 page = urllib.request.urlopen(url)
except:
 print(“An error occured.”)

soup = BeautifulSoup(page, ‘html.parser’)

regex = re.compile(‘c_but_base c_but’)
content_lis = soup.find_all(‘button’, attrs={‘class’: regex})
print(content_lis)
因此,我尝试对该网页进行同样的操作。我检查了该网页,发现投注率存储在“ui touchlink needsclick price Oddle price”类的按钮中。请参见下面的代码:

from bs4 import BeautifulSoup
import urllib.request
import re

url = "https://www.winamax.fr/paris-sportifs/sports/1/7/4"

try:
    page = urllib.request.urlopen(url)
except Exception as e:
    print(f"An error occurred: {e}")

soup = BeautifulSoup(page, 'html.parser')

regex = re.compile('ui-touchlink-needsclick price odd-price')
content_lis = soup.find_all('button', attrs={'class': regex})
print(content_lis)
问题是它什么也不打印:Python找不到这样的类的元素(对吗?)。因此,我尝试打印soup对象,以查看BeautifulSoup函数到底在做什么。我添加了这一行

print(soup)

打印时(因为太长,我没有显示汤汁打印),我注意到这与我右键单击Winamax网页“检查”时显示的文本不同。那么BeautifulSoup函数到底在做什么?如何使用BeautifulSoup存储Winamax网站的投注率


编辑:我从来没有用html编码过,而且我是Python的初学者,所以有些术语可能是错误的,这就是为什么有些部分用斜体。

这是因为网站使用
JavaScript
来显示这些细节,而BeautifulSoup本身不与
JS
交互

首先,试着找出你想要刮取的元素是否存在于页面源中,如果是这样,你可以刮取几乎所有的东西!在你的例子中,按钮/span标记不在页面源中(意味着隐藏或通过脚本拉取)

页面中没有
标记源:

因此,我建议使用硒作为解决方案,并尝试了网站的基本刮擦

以下是我使用的代码:

from selenium import webdriver

option = webdriver.ChromeOptions()
option.add_argument('--headless')
option.binary_location = r'Your chrome.exe file path'

browser = webdriver.Chrome(executable_path=r'Your chromedriver.exe file path', options=option)

browser.get(r"https://www.winamax.fr/paris-sportifs/sports/1/7/4")

span_tags = browser.find_elements_by_tag_name('span')
for span_tag in span_tags:
    print(span_tag.text)

browser.quit()
这是输出:


此输出中存在一些垃圾数据,但这需要您确定您需要什么和不需要什么!

“我注意到,这与我右键单击Winamax网页“检查”时显示的文本不同。"这是您的实际问题,与BeautifulSoup无关。在构建刮板时经常会发生这种情况:网站不会向机器人发送相同的响应。尤其是赌博网站,它们肯定具有反机器人保护。您在浏览器中看到的网页可能是事后用Javascript编辑的。感谢@Ananth提供的answer!但是,当运行代码时,我得到的不是相同的输出,而是整个Javascript网页。我是否遗漏了什么?您是否对代码进行了任何更改?除了文件路径之外。抱歉,我运行了错误的文件…但是,当运行您的文件时,我收到了一些错误消息,如:“file”C:(…)Python\Python37\lib\subprocess.py“,第1172行,在“执行\u child startupinfo)PermissionError:[WinError 5]拒绝访问”中,并且在您的代码中,从未使用过“option.binary\u location”对象。您应该在第7行中使用它,而不是在“r'your chromedriver.exe file path”中使用它,对吗?(我知道它不会更改任何内容,但希望确保我做得对)如果您有
PermissionError
,则有两件事。1)如果您使用cmd/terminal运行文件,则使用cmd作为admin/sudo。2)您的路径变量(用于驱动程序和浏览器)应该是这样的
C:\Program Files\BraveSoftware\Brave Browser\Application\Brave.exe
Brave是我使用的浏览器,因此链接也应该包含.exe文件名。请检查此文件并通知我。