所以我想从这个链接中提取“bilibili-player-视频-info-people-number”链接:https://www.bilibili.com/video/BV1a44y167wK。当我创建我的漂亮汤对象并搜索它时,这个类就不在那里了。是解析器造成的吗?我确实尝试了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])返回一个超出范围的错误,因为查看器对象中没有任何内容。
谢谢!
发布于 2021-06-12 14:21:24
几乎整个站点都在JavaScript后面,所以bs4是无用的,除非您想要的元素在请求的HTML中。在你的情况下,不是。
但是,您可以查询一个API端点,它包含这些数据(以及更多的数据)。
只要有一点regex和requests,你就可以获得(观看者的)在线计数。
下面是操作步骤:
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发布于 2021-06-12 19:56:54
我确实设法解决了以下问题:
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的字符串中,第二个命令搜索我想要的非常具体的部分,并在其中找到数字。不知道这是否是最好的方式,但它是有效的,并感谢大家的意见。
https://stackoverflow.com/questions/67949200
复制相似问题