【问题标题】:Unable to get specific tag using bs4?无法使用 bs4 获取特定标签?
【发布时间】:2021-06-02 07:56:02
【问题描述】:

我正在使用 bs4 和 python 3.6 我的问题是有一个 youtube 搜索页面,我想获取其中第一个视频的链接,所以我在检查该锚标记的 id 后发现是 video-title 和我使用该参数来查找使用以下代码的标签以及每个视频的锚标签的链接具有与video-title 相同的ID 所以我决定使用find 而不是find_all

from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests

soup =BeautifulSoup(requests.get('https://www.youtube.com/results?search_query=unravel').text,'lxml')

link = soup.find('a',id="video-title")
print(link)

但作为回报,它会给予

None

我已尝试获取所有锚标记,但这也不包括我想要的标记。

谁能说出问题出在哪里?

【问题讨论】:

  • Youtube 使用动态数据渲染意味着数据是由 JS 渲染的,如果你打印汤,你将找不到a tag,所以你可以尝试使用 selenium api 或 youtube python 包
  • @Bhavya 你能详细说明一下吗

标签: python web-scraping beautifulsoup python-requests


【解决方案1】:

你可以使用这个 "\watch?v=\w+" 让你的链接比 bs4 更简单☺

使用 selenium 和正则表达式以获得最佳结果

【讨论】:

  • 你能详细解释一下吗
  • 他的意思是上面的正则表达式将帮助您过滤所有包含\watch?v= 的网址。就像@bhavya 说 youtube 使用动态数据渲染,所以使用 selenium 或 youtube api 是你最好的选择,你必须选择你想要使用的。
【解决方案2】:

假设您的环境中安装了seleniumlxml,您可以尝试此操作。

from selenium import webdriver
from bs4 import BeautifulSoup

def get_tag():
  chrome_options = webdriver.ChromeOptions()
  chrome_options.add_argument('--headless')
  chrome_options.add_argument('--no-sandbox')
  chrome_options.add_argument('--disable-dev-shm-usage')
  driver = webdriver.Chrome('chromedriver',chrome_options=chrome_options)

  driver.get('https://www.youtube.com/results?search_query=unravel')
  # print(driver.page_source)
  soup = BeautifulSoup(driver.page_source, 'lxml')
  atags = soup.find_all('a',{'id':'video-title'})
  for tag in atags:
    print(tag.get('title'))

此方法将返回 <a> 标签的标题,其 ID 为 <video-title>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 2020-10-25
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多