首页 > 编程问答 >如何使用 beautifulsoup4 选择部分 HTML 标签进行网页抓取

如何使用 beautifulsoup4 选择部分 HTML 标签进行网页抓取

时间:2024-08-09 03:48:53浏览次数:11  
标签:python html python-3.x web-scraping beautifulsoup

这是我试图从中抓取数据的网站的链接: https://www.fotmob.com/leagues/47/stats/season/20720/players/goals/premier-league 我想使用 beautifulsoup4 选择 class = 'css-653rx1-StatsContainer eozqs6r5' 的部分。

在您提到 find() 和 find_all() 之前,我已经使用了两者,但由于某种原因,就像部分标签不存在一样。当我尝试section = soup.find('section', class_='css-653rx1-StatsContainer eozqs6r5') 时,它没有返回。当我尝试section = soup.find_all('section', class_='css-653rx1-StatsContainer eozqs6r5')时,它返回一个空列表。

然后我遍历了DOM,并且能够选择该部分之前的每个div 。 oncd 我尝试访问该部分,但它没有返回。

这是我的代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

# URL of the webpage you want to scrape
url = 'https://www.fotmob.com/leagues/47/stats/season/20720/players/goals/premier-league'

# Send HTTP request to the URL
response = requests.get(url)

# Parse the HTML content of the page
soup = BeautifulSoup(response.content, 'html.parser')

# Remove <style> tags
for style in soup.find_all('style'):
    style.decompose()

# Remove <script> tags
for script in soup.find_all('script'):
    script.decompose()

outer_main = soup.find('main', class_='css-1cyagd9-PageContainerStyles e19hkjx10')


section = soup.find_all('section', class_='css-653rx1-StatsContainer eozqs6r5')
for sec in section:
    print("T")


#print(soup.prettify())
# Print the HTML of the outer <main> for debugging
if outer_main:
    print("Outer <main> found.")
else:
    print("The outer <main> tag with the specified class was not found.")


# Navigate through the HTML structure to find the target div
main_div = outer_main.find('main') if outer_main else None  # Adjust this if nested <main> exists
if main_div:
    print("Found inner <main>.")
else:
    print("Inner <main> not found.")
   
div1 = main_div.find('div', class_='css-xxmbx0-LeagueSeasonStatsColumn eozqs6r0') if main_div else None
if div1:
    print("Found div1 with class 'css-xxmbx0-LeagueSeasonStatsColumn eozqs6r0'.")
else:
    print("div1 with class 'css-xxmbx0-LeagueSeasonStatsColumn eozqs6r0' not found.")


div1 = div1.find('div', class_='css-1wb2t24-CardCSS e1mlfzv61') if div1 else None
if div1:
    print("Found div1 with class 'css-1wb2t24-CardCSS e1mlfzv61'.")
else:
    print("div1 with class 'css-1wb2t24-CardCSS e1mlfzv61' not found.")


div1 = div1.find('div', class_='css-1yndnk3-LeagueSeasonStatsContainerCSS eozqs6r1') if div1 else None
if div1:
    print("Found div1 with class 'css-1yndnk3-LeagueSeasonStatsContainerCSS eozqs6r1'.")
else:
    print("div1 with class 'css-1yndnk3-LeagueSeasonStatsContainerCSS eozqs6r1' not found.")


div1 = div1.find('section', class_='css-653rx1-StatsContainer eozqs6r5') if div1 else None
if div1:
    print("Found section with class 'css-653rx1-StatsContainer eozqs6r5'.")
else:
    print("section with class 'css-653rx1-StatsContainer eozqs6r5' not found.")


div1 = div1.find('div', class_='css-fvfi51-LeagueSeasonStatsTableCSS e15r3kn20') if div1 else None
if div1:
    print("Found div with class 'css-fvfi51-LeagueSeasonStatsTableCSS e15r3kn20'.")
else:
    print("div with class 'css-fvfi51-LeagueSeasonStatsTableCSS e15r3kn20' not found.")

结果:

Outer <main> found.
Found inner <main>.
Found div1 with class 'css-xxmbx0-LeagueSeasonStatsColumn eozqs6r0'.
Found div1 with class 'css-1wb2t24-CardCSS e1mlfzv61'.
Found div1 with class 'css-1yndnk3-LeagueSeasonStatsContainerCSS eozqs6r1'.
section with class 'css-653rx1-StatsContainer eozqs6r5' not found.
div with class 'css-fvfi51-LeagueSeasonStatsTableCSS e15r3kn20' not found.

我尝试删除脚本和样式标签,因为我在 Develeper 工具内的 HTML 中看不到它们。

基本上,我根据其类别选择每个 div,但由于某种原因,当我尝试选择该部分时,它不起作用。 我还尝试遍历包含该部分的父 div 之后的每个元素,但由于某种原因,它只是跳过该部分并继续下一个 html 元素,就像该部分不存在一样。

我什至不确定什么此时要做的。当我运行 print(soup.prettify()) 时,部分标签没有显示。这非常令人困惑,因为我可以清楚地看到开发人员工具中的部分标签。任何有关如何选择部分工具的帮助都将不胜感激!

此外,为了它的价值,我尝试了 Selenium,但这让我发疯。我的 chrome 版本(版本 127.0.6533.100)似乎没有 Chromedriver,而最新版本的 chromedrivers 是(版本:127.0.6533.99)。至少这是我最好的解释。


你抓取不到那个部分中内容的原因是,那个特定的 HTML 元素(section tag)是由 JavaScript 加载的,而你用 requests 库做的是抓取原始的 HTML。 requests 库并不执行网页上的 JavaScript 代码。

为了解决这个问题,你需要使用类似于 Selenium 或者 Playwright 这样的工具,这些工具可以渲染网页并执行 JavaScript。

下面是用 Selenium 抓取数据的例子:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup

# 指定网站 URL
url = "https://www.fotmob.com/leagues/47/stats/season/20720/players/goals/premier-league"

# 初始化 Selenium WebDriver
driver = webdriver.Chrome()  # 确保你已经下载了 ChromeDriver 并将其添加到 PATH 中

# 打开网页
driver.get(url)

# 等待目标元素加载完毕
section = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "section.css-653rx1-StatsContainer.eozqs6r5"))
)

# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(driver.page_source, 'html.parser')

# 找到目标 section
target_section = soup.find('section', class_='css-653rx1-StatsContainer eozqs6r5')

# 打印 section 的内容
print(target_section)

# 关闭浏览器
driver.quit()

这段代码会:

  1. 初始化 Selenium WebDriver 并打开 Chrome 浏览器。
  2. 打开目标网页
  3. 等待目标 section 元素加载完毕 。这里使用了 WebDriverWait expected_conditions 来确保 JavaScript 加载完数据后再进行下一步操作。
  4. 获取网页源代码 并使用 BeautifulSoup 进行解析。
  5. 找到目标 section 并打印其内容。
  6. 关闭浏览器

请确保你已经下载了 ChromeDriver 并将其添加到你的系统 PATH 中。 你可以从这里下载 ChromeDriver: https://chromedriver.chromium.org/downloads

希望这个例子可以帮助你抓取到想要的数据!

标签:python,html,python-3.x,web-scraping,beautifulsoup
From: 78850195

相关文章

  • 如何从我的 Python 应用程序更新我的 Facebook Business 令牌?
    我有一个使用FacebookBusiness库的Python应用程序。因此,我需要使用Facebook提供的令牌来访问我的见解并操纵它们。但是,这个令牌有一个很长的到期日期,但我想知道是否有办法自动更新这个令牌在我的应用程序中,这样它就不会停止运行。当然可以!你可以使用Facebook提......
  • 哪种编程语言更适合学习数据结构和算法:C++、Java 还是 Python?
    作为一名工程专业的学生,​​我正在尝试决定使用哪种编程语言来学习数据结构和算法(DSA)。我正在考虑C++,它提供高性能和强大的标准模板库,但对于初学者来说可能很复杂。Java具有强大的语法和内置集合,使DSA概念更容易掌握,尽管我不确定它与C++相比的性能。Python以其简单性和......
  • 同时运行多个异步阻塞函数 - Python
    我是Python和协程的新手,我正在尝试利用Python的asyncio库来并行处理阻塞函数。我正在使用python3.8.6。我有一个阻塞函数,它从数组输入中接收不同的输入,我需要每个输入的阻塞函数同时运行。我已经尝试过,但它们似乎仍然按顺序运行:asyncdefmain():tasks=[asyncio......
  • 使用两个连接的字符串调用变量 Python
    抱歉缺乏细节,因为我是python的初学者:c1=c2=c3=c4=c5=Falsex=int(input("Enteranumber1-5:"))ifx>5orx<1:print("Yournumbermustbebetween1and5")else:"c",x=True第8行是连接2个字符串的地方。我不确定......
  • 测试Python中是否存在可执行文件?
    在Python中,有没有一种可移植且简单的方法来测试可执行程序是否存在?简单我的意思是类似which命令的东西,这将是完美的。我不想手动搜索PATH或涉及尝试使用Popen&al执行它并查看它是否失败(这就是我现在正在做的事情,但想象它是launchmissiles)......
  • Python 和 Excel:将数据放入另一个函数中,然后从中获取信息
    我正在尝试将温度/压力数据放入蒸汽表以获得过热焓数据。我已经成功地获取了数据并将其放入Excel文件中,然后它为我提取了焓数据。问题是,当我将温度和压力数据放入蒸汽表时,它实际上并没有进行双重插值,因此焓(H)值实际上从未改变ng。我最终只得到了蒸汽数据中给出......
  • Python 类型提示:显式排除无效的重载组合?
    我有一个带有两个参数的函数,每个参数都可以采用两种类型之一。四个成对组合中的三个有效,但第四个无效。我想找到一种方法来键入提示此场景,可以检查这些类型,但不一定每次调用foo()时都必须编写代码来检查无效情况。有没有办法可以改进foo()、bar()或两......
  • 我在制作 python 语音应用程序时遇到错误
    我编写了一个语音聊天应用程序代码,但是当我们运行此代码并加入语音频道时,我收到照片中的错误错误1错误2这是我的代码;客户端代码:importtkinterastkfromtkinterimportmessageboximportpyaudioimportsocketimportthreadingimporttimeHOST=......
  • pyocr,一个超酷的Python库!
    pyocr是一个用于光学字符识别(OCR)的Python库,它提供了一个简单的接口,允许开发者将图片中的文本提取出来。这个库是对Tesseract-OCR的封装,使得在Python环境中使用OCR技术变得更加便捷。如何安装pyocr首先,要使用pyocr库,您需要安装它。可以使用pip包管理工具来进......
  • pattern,一款超牛的Python库
    在程序开发中,处理文本数据和进行自然语言处理是常见需求。pattern是一个强大的Python库,专为文本分析而设计,提供了丰富的功能,包括自然语言处理、数据挖掘和网络分析等。它简单易用,让程序员能够快速实现复杂的文本处理任务。如何安装pattern在开始使用pattern库之前,首先......