如何从这些span标记之间刮取数据?

2024-09-30 22:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图将https://www.usdebtclock.org/world-debt-clock.html上显示的数字略过,但是由于数字不断变化,我不知道如何收集这些数据。 这是我试图做的一个例子

import requests
from bs4 import BeautifulSoup

url ="https://www.usdebtclock.org/world-debt-clock.html"
URL=requests.get(url)
site=BeautifulSoup(URL.text,"html.parser")
data=site.find_all("span",id="X4a79R9BW")

print(data)

结果是:

“[]” 当我怀孕的时候

“$19987137284731”

有什么我可以更改以提取号码的吗


Tags: httpsorgimporturlworldhtmlwwwsite
2条回答

BeautifulSoup无法为您执行此操作,因为您需要的数据是由JavaScript提供的,并且BeautifulSoup不支持JS处理

另一种方法是使用Selenium WebDriver之类的工具:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://www.usdebtclock.org/world-debt-clock.html')
elem2 = driver.find_element_by_xpath('//span[@id="X4a79R9BW"]')
print(elem2.text)
driver.close()

如果您以前没有使用过Selenium WebDriver,则需要遵循安装说明here

特别是,您需要按照说明下载您选择的浏览器驱动程序(我使用geckodriver for Firefox)。并确保可执行文件位于您的路径上

(我希望还有其他基于Python的替代方案。)

基于页面的代码,我认为您想要实现的可能不可能是BS。运行代码返回[<span id="X4a79R9BW"> </span>]。尝试getText()在该问题上返回任何结果。在查看页面时,我注意到跨度中的数值与页面上的数值一样不断更新。查看页面源代码显示X4a79R9BW出现在页面的五个位置。首先设置字体的各个方面,处理公式的几个位置,最后设置代码所刮取的空白范围。从源代码来看,计数器似乎是一个在标记<script type="text/javascript">内运行的等式。下面是我认为在JavaScript标记下运行的等式:

{'leftMargin':0,'color':-16751104,:0 */var X3a34729DW = /*144,:14 */    96.9230013  /*751104,:0 */; var R3a45G7S =   /*7104,:54 */  0.000000306947   /*43,451134,:5 */; var Y12 = /*241,:15457 */   18442.16666 /*19601*2*2*/*21600*2*2; /*79301*2*2*/    var Class = new Date(); var Method = Class.getTime() / 1000 - Y12a4798; var Public = X3a34729DW + Method * R3a45G7S;    var Assign = FormatNumber2(Public); document.getElementById   ('X3a34729DW')  .firstChild.nodeValue = Assign; /*'advance':4289}

页面源代码的这一部分表示您想要的文本正在通过JavaScript不断更新。鉴于此,我的理解是,BS不是完成所需任务的合适库。虽然我自己并没有使用它,但我已经看到Selenium是一个建议的库,可以通过JavaScript动态更新页面。祝你好运,也许其他人可以提供一条更清晰的前进道路

相关问题 更多 >