当前位置: 首页 > 知识库问答 >
问题:

为什么我和BeautifulSoup有一个属性错误?

栾鸣
2023-03-14

我在用BeautifulSoup抓取网页时收到一个属性错误。我想用一个特定的选择器从网页中获取一个特定的文本,但是我得到了这个错误。谁能告诉我如何正确使用CSS选择器,就像我在下面给出的那样?

错误:

AttributeError: 'NoneType' object has no attribute 'text' 

CSS选择器

#col-body > div > social-influence > div.row.row-zero.influence-others.panel-inactive > div:nth-child(3) > h4

我的代码

from bs4 import BeautifulSoup
import requests

html = requests.get("https://www.cryptocompare.com/coins/bnb/influence/USDT").text
soup = BeautifulSoup(html, 'html.parser')
total_commit = soup.select_one("#col-body div social-influence div.row.row-zero.influence-others.panel-inactive div:nth-child(3) h4").text
print(total_commit)

预期产出:

We don't have any code repository data yet.

共有2个答案

濮君植
2023-03-14

事实证明,CSS选择器没有任何问题(显示的原始版本或代码中使用的修改版本;两者都选择相同的内容)。问题是您想要的页面部分是由JavaScript动态生成的,因此它不在HTML中。要查看此信息,请尝试:

from bs4 import BeautifulSoup
import requests

html = requests.get(
    'https://www.cryptocompare.com/coins/bnb/influence/USDT'
).text
with open('output.txt', 'w') as f:
    f.write(html)

如果您在结果文件中搜索"我们还没有任何代码存储库数据.",您会发现它不在那里。

因此,我们不仅需要访问HTML页面,还需要运行其JavaScript,并保存生成页面的源代码。如本答案所述,您可以使用硒来实现这一点。您首先必须安装Selenium(pip install Selenium应该可以工作),并根据您的操作系统下载geckodriver可执行文件。

完成后,您的代码(与Mr.曼哈顿的增加)看起来像这样:

from contextlib import closing

from bs4 import BeautifulSoup
from selenium.webdriver import Firefox

with closing(Firefox()) as browser:
    browser.get('https://www.cryptocompare.com/coins/bnb/influence/USDT')
    html = browser.page_source

soup = BeautifulSoup(html, 'html.parser')
total_commit_node = soup.select_one(
    '#col-body > div > social-influence > '
    'div.row.row-zero.influence-others.panel-inactive > div:nth-child(3) > h4'
)

if total_commit_node:
    print(total_commit_node.text)
else:
    print('Could not match CSS selector')

(注意:我将选择器拆分为两行以避免滚动。它的功能完全相同,因为连续的字符串文本会自动连接。)

对我来说,这正确地输出了:

We don't have any code repository data yet.
唐高卓
2023-03-14

您的查询与以下内容不匹配:

total_commit_node  = soup.select_one(
    '#col-body div social-influence div.row.row-zero.influence-others.panel-inactive div:nth-child(3) h4')

if total_commit_node:
    print(total_commit_node.text)
else:
    print('Could not match css selector')
 类似资料:
  • 问题内容: 我正在遵循一个教程来尝试学习如何使用BeautifulSoup。我正在尝试从下载的HTML页面上的URL中删除名称。至此,我的工作非常顺利。 但是当我进入下一部分时 我得到这个错误 问题答案: 这是IDLE和BeautifulSoup对象(子类)之间的错误交互。见问题1757057;已经有一段时间了。 解决方法是先将对象转换为纯unicode值:

  • 问题内容: 我最近将Windows计算机上的BeautifulSoup从3.0版升级到了4.1版。 我现在遇到一个奇怪的错误: 这是导致引发异常的代码段: BS的文档没有提到构造函数签名是如何从v3更改为v4的。我该如何解决? 问题答案: 传入的HTML或XML实体始终会转换为相应的Unicode字符。Beautiful Soup 3有许多重叠的实体处理方式,已被删除。 BeautifulSoup

  • 想知道这里可能发生了什么,以及如何解决这个错误?它不像taglibs库版本出现在mvnrepository站点上那样出现,所以我想知道该怎么办? 提前谢了。

  • 监听可以正常触发,而计算属性无法触发

  • 问题内容: 在jQuery 1.6.1中进行更改之后,我一直在尝试定义HTML中属性和属性之间的差异。 查看jQuery1.6.1发行说明中的列表(在底部附近),似乎可以对HTML属性和属性进行如下分类: 属性:所有具有布尔值或UA计算得出的值,例如selectedIndex。 属性:可以添加到既不是布尔也不包含UA生成值的HTML元素中的“属性”。 有什么想法吗? 问题答案: 在编写HTML源代

  • 问题内容: 在jQuery 1.6.1中进行更改之后,我一直在尝试定义HTML中属性和属性之间的差异。 查看jQuery1.6.1发行说明中的列表(在底部附近),似乎可以对HTML属性和属性进行如下分类: 属性:所有具有布尔值或UA计算得出的值,例如selectedIndex。 属性:可以添加到既不是布尔也不包含UA生成值的HTML元素中的“属性”。 有什么想法吗? 问题答案: 在编写HTML源代