python-3.x 刮youtube与美丽的soup4

monwx1rj  于 2023-05-23  发布在  Python
关注(0)|答案(1)|浏览(140)

YouTube的HTML有一些自定义元素,比如yt-formatted-string,你可以看到,如果没有youtube的javascript,你不能在HTML解析器中解码,beautifulsoup4解析错误。
代码如下:

from bs4 import BeautifulSoup
import requests

url = "https://www.youtube.com/watch?v=S4E4yAktjug"

response = requests.get(url)

if response.status_code == 200:
    doc = BeautifulSoup(response.text, "html.parser")
    data_container = doc.find('div', {'id': 'info-container'})

    print(data_container.prettify())

打印如下:

<div id="info-container">
 <div class="skeleton-light-border-bottom" id="primary-info">
  <div class="text-shell skeleton-bg-color" id="title">
  </div>
  <div id="info">
   <div class="text-shell skeleton-bg-color" id="count">
   </div>
   <div class="flex-1">
   </div>
   <div id="menu">
    <div class="menu-button skeleton-bg-color">
    </div>
    <div class="menu-button skeleton-bg-color">
    </div>
    <div class="menu-button skeleton-bg-color">
    </div>
    <div class="menu-button skeleton-bg-color">
    </div>
    <div class="menu-button skeleton-bg-color">
    </div>
   </div>
  </div>
 </div>
 <div class="skeleton-light-border-bottom" id="secondary-info">
  <div id="top-row">
   <div class="flex-1" id="video-owner">
    <div class="skeleton-bg-color" id="channel-icon">
    </div>
    <div class="flex-1" id="upload-info">
     <div class="text-shell skeleton-bg-color" id="owner-name">
     </div>
     <div class="text-shell skeleton-bg-color" id="published-date">
     </div>
    </div>
   </div>
   <div class="skeleton-bg-color" id="subscribe-button">
   </div>
  </div>
 </div>
</div>

**[编辑]**这些是预期值:

2.4M views 1年前

[编辑结束]

因此,当我尝试检索视图计数时,它返回None。有可能解决吗?
我尝试逐个执行此操作,首先获取信息容器,然后是另一个元素,然后是视图计数,但它返回NoneType object has no attribute find.
我还尝试列出所有span并提取具有视图的span,但这是低效的,令人困惑的,并且失败了。

v8wbuo2f

v8wbuo2f1#

@Rayaankhan,因为涉及javascript,请求lib不支持。这就是为什么你得到不同的HTML内容。但是,您仍然可以在其中一个script标记中获取所有数据,并且数据位于需要解析的深度嵌套JSON中- Ajeet Verma。正如您在Ajeet的评论中看到的,请求库不返回javascript,因此我需要从外部获取javascript并使用它呈现HTML

相关问题