我在用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.
事实证明,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.
您的查询与以下内容不匹配:
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源代