Python:Beautifulsoup 返回 None 或 [ ]

Posted

技术标签:

【中文标题】Python:Beautifulsoup 返回 None 或 [ ]【英文标题】:Python: Beautifulsoup returning None or [ ] 【发布时间】:2019-05-27 14:22:27 【问题描述】:

你好我正在练习我的请求和网络抓取技巧,所以我试图在 youtube 上抓取热门页面,并拉出热门视频的标题,即这个链接 youtube

这是我正在运行的代码

import requests
from bs4 import BeautifulSoup

url = 'https://www.youtube.com/feed/trending'
html = requests.get(url)
soup = BeautifulSoup(html.content, "html.parser")
a = soup.find_all("a", "id": "video-title")
print(a)

及其返回[],我不明白为什么它在源代码中返回[],

【问题讨论】:

正如以下所有答案中所述,内容是动态的,无法使用requests 检索。通常,我们可以对 javascript 代码进行逆向工程,但通常不值得,而且使用selenium 更容易。 【参考方案1】:

打印变量html.content 的内容——它是否包含那个ID?

我敢打赌,youtube.com 是一个严重依赖 javascript 的网站,但 requests 模块没有 js 引擎。你的浏览器看到的通常不是 requests 这样的模块看到的。

【讨论】:

除了硒还有其他方法吗?喜欢更多的请求吗?【参考方案2】:

您可能需要像 selenium 这样的方法,它可以让页面有时间完全呈现。以下目前产生 70 个标题。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

url = 'https://www.youtube.com/feed/trending'

d = webdriver.Chrome()
d.get(url)
titles = [title.text for title in WebDriverWait(d,20).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#video-title")))]
print(titles)
d.quit()

【讨论】:

除了硒还有其他方法吗?喜欢更多的请求吗? 您可以添加无头参数以避免出现浏览器 我如何判断一个网站是否使用 javascript 而不是仅使用 html,? 您可以在浏览器中关闭 javsascript 并与启用 js 的响应进行比较 如果页面在您与之交互时也会更新。【参考方案3】:

网络正在发展,它变得越来越难以理解。在大多数情况下,“现代”网页不再由服务器生成,因为用户将看到它们;相反,大量脚本被发送给用户,并且基本上将任何¯\_(ツ)_/¯ 注入到 DOM 中。

这就是为什么您需要在成熟的浏览器中使用 Selenium 绑定,正如上面 QHarr 所提到的。

我很抱歉没有对此发表评论,但显然我需要 50 分才能做到这一点。

【讨论】:

除了硒还有其他方法吗?喜欢更多的请求吗? 好吧,Python 有一个适用于所有内容的库,因此可能有 Selenium 的替代品,但它最终可能会做几乎相同的事情:要么模拟一个成熟的浏览器,要么控制一个完整的浏览器。 - 浏览器。幸运的是,有一种使用 Selenium 的方法,其中浏览器是“无头”的,这意味着它实际上不会侵入您操作系统中的 GUI,即您不必有弹出窗口。已经有一段时间了,但我认为我上次使用它的方式是使用专门构建的 Chromium 版本。 我如何判断一个网站是否使用 javascript 而不是仅使用 html,? 这是一个很难回答的问题,因为实在没有办法直接观察它。我想说,作为一个粗略的指南,如果 Python Requests 之类的库不起作用,您可能可以推断出网站是否“使用 Javascript”(以single-page app (SPA) 的方式)。您还可以寻找其他迹象:如果网站似乎以零碎的方式加载(在 Youtube 上尤其明显),或者,在您的浏览器的 Web Inspector 中,如果 index.html 似乎没有包含太多任何内容和引用一个大的 JS 包。

以上是关于Python:Beautifulsoup 返回 None 或 [ ]的主要内容,如果未能解决你的问题,请参考以下文章

Python:Beautifulsoup 返回 None 或 [ ]

Python库-BeautifulSoup

BeautifulSoup nth-of-type 返回空列表。 Soup.select()[n -1] 返回元素。为啥?

带有 BeautifulSoup 的 Python Requests/Selenium 每次都没有返回 find_all

使用Python BeautifulSoup查找页数

Python爬虫连载12-爬虫正则表示式BeautifulSoup初步