【问题标题】:parsing site with beautifulsoup用beautifulsoup 解析网站
【发布时间】:2020-03-13 02:23:14
【问题描述】:

我正在尝试学习如何使用 python 解析 html 我目前卡在soup.findAll返回我一个空数组,因此有可以找到的元素 这是我的代码:

import requests
import urllib.request
import time
from bs4 import BeautifulSoup
headers = {"User-Agent":'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
url = 'https://www.oddsportal.com/matches/tennis/20191114/'

responce = requests.get(url,headers=headers)

soup = BeautifulSoup(responce.text, 'html.parser')

info = soup.findAll('tr', {'class':'odd deactivate'})

print(info)

我会感谢任何帮助,在此先感谢

【问题讨论】:

  • 它们可以动态添加。你检查过 responce 的内容了吗?
  • 我在页面中没有看到任何“奇数停用”tr,根本没有“停用”
  • 您应该包含response.text 的最小样本以完成您的minimal reproducible example
  • 有很多,imgur.com/qsZ9lw2@BlueSheepToken,我刚查了一下,好像没有这样的标签,是否意味着它们是动态添加的,我无法访问它?
  • responce中好像没有“odd deactivate”

标签: python beautifulsoup python-requests


【解决方案1】:

显然,一旦在浏览器中调用,页面只会加载“奇数”部分。所以你可以使用SeleniumChrome driver

请注意,您需要下载 Chrome 驱动程序并将驱动程序放在您的 .../python/ 目录中。确保选择匹配的驱动程序版本,即与您安装的 Chrome 浏览器版本匹配的 Chrome 驱动程序版本。

from bs4 import BeautifulSoup 
from urllib.request import urlopen 
import requests, time, traceback, random, csv, codecs, re, os

# Webdriver
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_argument('log-level=3')
browser = webdriver.Chrome(chrome_options=options)

url = 'https://www.oddsportal.com/matches/tennis/20191114/'
browser.get(url)
soup = BeautifulSoup(browser.page_source, "html.parser")
info = soup.findAll('tr', {'class':'odd deactivate'})
print(info) 

【讨论】:

  • 阅读错误:获取与您在计算机上安装的 Chrome 浏览器版本相匹配的 Chrome 驱动程序版本。在浏览器中检查 Chrome 版本,例如 -> 帮助 -> 关于 Google Chrome
【解决方案2】:

我正在尝试学习如何使用 python 解析 html

当涉及到网络抓取时,您碰巧选择了一个对初学者不太友好的网页。从广义上讲,大多数网页使用以下两种常用方法中的一种或两种来加载/显示数据:

  • 用户向服务器发出请求(例如,访问页面)。 服务器从数据库中获取必要的数据。服务器 使用模板引擎生成 HTML 响应,并返回 用户浏览器呈现的响应。
  • 用户向服务器发出请求。服务器返回一个 动态填充数据的 HTML 骨架响应 提出其他请求/使用 API 等。

您选择的网页属于第二种类型。仅仅因为您可以在 Chrome 的开发工具的“元素”选项卡中看到 <tr> 元素,并不意味着这就是服务器发送给您的内容。通过查看 Chrome 开发工具的网络选项卡,您可以看到对这两个资源发出了请求: https://fb.oddsportal.com/ajax-next-games/2/0/1/20191114/yje3d.dat?=1574007087150 https://fb.oddsportal.com/ajax-next-games-odds/2/0/X0/20191114/1/yje3d.dat?=1574007087151

(查询字符串参数对您来说将不一样。除非您提供正确的有效负载,否则访问这些 url 也不会很有趣。)

第一个资源似乎是发出请求的 jQuery 脚本,其响应包含 HTML(这是您的表格)。它看起来像这样:

您可以看到他们似乎为每个匹配项分配了唯一的 ID。在这种情况下,Giron Marcos 与 Holt Brandon 的 ID 为 ATM9GmXG

第二个资源类似。它也是一个 jQuery 脚本,似乎正在向他们的主要 API 发出请求。这次的响应是 JSON,这对于网络爬虫来说总是可取的。这是其中的一部分(注意相同的 ID):

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 1970-01-01
    • 2017-03-08
    • 2018-05-11
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2021-01-30
    • 2022-01-11
    相关资源
    最近更新 更多