【问题标题】:Required item not in soup object - BeautifulSoup Python汤对象中没有必需的项目-BeautifulSoup Python
【发布时间】:2021-06-12 13:14:08
【问题描述】:

所以我想从这个链接中提取“bilibili-player-video-info-people-number”: https://www.bilibili.com/video/BV1a44y167wK。当我创建我的 beautifulsoup 对象并搜索它时,这个类不存在。是因为解析器吗?我确实尝试过 lxml 和 html5lib,但都没有更好。

<span class="bilibili-player-video-info-people-number">585</span>

这是我要提取的完整元素 - 数字每分钟更新一次,以显示当前有多少人正在观看。

import time
from bs4 import BeautifulSoup
from selenium import webdriver
import re
import html5lib

driver = webdriver.Chrome(r'C:\Users\Rob\Downloads\chromedriver.exe')

driver.get('https://www.bilibili.com/video/BV1a44y167wK')

content = driver.page_source.encode('utf-8').strip()
soup = BeautifulSoup(content, 'html5lib')

viewers = soup.findAll('span', class_='bilibili-player-video-info-people-text')

print(viewers[0])

print(viewers[0]) 返回一个超出范围的错误,因为查看器对象中没有任何内容。

谢谢!

【问题讨论】:

  • 你能检查一下你在content变量中得到了你期望的东西吗?
  • 非常感谢这个提示 - 亲爱的托比亚斯。太棒了 - 学习的重要资产!

标签: python web-scraping beautifulsoup


【解决方案1】:

几乎整个网站都在JavaScript 后面,所以bs4 是没用的,除非你想要的元素 在请求的HTML 中。在你的情况下,不是

但是,您可以查询一个 API 端点来携带此数据(以及更多)。

只需一点regexrequests,您就可以获得(观看者的)在线人数。

方法如下:

import re

import requests

with requests.Session() as connection:
    page_url = "https://www.bilibili.com/video/BV1a44y167wK"
    page = connection.get(page_url).text
    cid = re.search(r"cid\":(\d+),\"page", page).group(1)
    aid = re.search(r"aid\":(\d+),", page).group(1)
    url = f"https://api.bilibili.com/x/player/v2?cid={cid}&aid={aid}&bvid={page_url.rsplit('/', 1)[-1]}"
    print(connection.get(url).json()["data"]["online_count"])

输出(注意:它可能会随着观众的来来去去而改变):

562

【讨论】:

  • 是否可以通过 Selenium 获取呈现的 HTML?
  • @tobias 是的,有可能。
  • 我认为这就是他使用selenium 包的原因。也许您可以在答案中添加如何做到这一点?
  • 嗯...几乎所有我想要的东西(喜欢、硬币、cmets 等)都可用,所以我只是假设这也是。多么令人恼火!你能告诉我如何用硒来做吗?那个 API 看起来相当复杂!
  • 我想你想用这个https://www.bilibili.com/video/BV1a44y167wK 替换page_url 中使用的url 以获得正确的数字。其余的应该是@baduker。
【解决方案2】:

我确实设法解决了这个问题:

    html = driver.execute_script("return document.getElementsByTagName('html')[0].innerHTML")
    start = re.search('<span class="bilibili-player-video-info-people-number">(.*)</span>',html)

第一个命令从网页中获取所有 html 并将其存储在一个名为 html 的字符串中,第二个命令搜索我想要的非常具体的部分并找到介于两者之间的数字。不确定这是否是最好的方法,但它有效,感谢所有评论的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多