当元素确实存在时,BeautifulSoup返回none

2024-09-30 01:33:11 发布

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

我是新来的网络刮取,一直在使用BeautifulSoup来获取每日抵押贷款利率。然而,很多我试图搜集的服务网站返回“无”或一个空列表。我试图抓取的标签肯定存在,我只是不明白为什么会这样。下面是一个例子。在

html=urlopen('https://www.popular.com/en/mortgages/')
bs0bj=BeautifulSoup(html, 'html.parser');
rate=bs0bj.find('span', {'class':'text-md text-popular-medium-blue'}).div
print(rate)

Tags: texthttps网络列表rate网站html标签
3条回答

要获得所需的数据,可以将selenium与python结合使用,如下所示:

from bs4 import BeautifulSoup
from selenium  import webdriver

driver = webdriver.Chrome()
driver.get('https://www.popular.com/en/mortgages/')

soup = BeautifulSoup(driver.page_source,"lxml")
item = soup.select('.table-responsive')[0].select("span div")[0].text
print(item)
driver.quit()

结果:

^{pr2}$

如果您检查页面源代码(例如通过Chrome或Firefox中的view-source:,或者通过将html字符串写入一个文件),您将看到您要查找的元素不在那里。实际上,费率是动态加载的:

<td>
  <span class="text-md text-popular-medium-blue">
    <script type="text/javascript" src = "https://apps.popular.com/navs/rates_wm_modx.php?id_rates=1&textcolor=3784D2&backgroundcolor=ffffff&t=1"></script>
  </span>
</td>

您可以按照脚本URL进行操作,您将看到响应如下所示:

^{pr2}$

此响应可能足够规则,可以在其上使用regex。在

正如rubik所说,速率是使用JS动态加载的。幸运的是,内容的结构相对简单,下面是我的分析方法:

在Chrome(或其他浏览器)中打开一个新选项卡,右键单击,然后选择view-source。切换到Network选项卡并选中preserve log选项。在

现在,打开网站https://www.popular.com/en/mortgages/。加载的内容可以在左侧面板看到。在

enter image description here

检查每个项目并分析其Preview内容,直到找到要废弃的内容。这是我发现的,2.75%与网站上显示的抵押贷款利率值相匹配。在

现在,切换到Headers选项卡并检查Request URL,这是发送到服务器的最后一个请求。在

enter image description here

下一步是分析请求URL https://apps.popular.com/navs/rates_wm_modx.php?id_rates=1&textcolor=3784D2&backgroundcolor=ffffff&t=1

我猜textcolor和{}表示css信息,所以我删除了它们,发现url仍然有效。在

现在我们有了一个更简单的url:https://apps.popular.com/navs/rates_wm_modx.php?id_rates=1&t=1

很明显,id_rates表示抵押贷款利率的顺序,而没有进行任何分析。问题是:t是什么意思?在

这可以通过分析其他预览内容来找到规则来回答。这里我想跳过这个过程,只给出结论。在

t=1表示Annual interestt=2表示APRt=6表示{}等:

完成这些操作后,现在可以直接从请求URL中删除内容:

from urllib2 import urlopen
import  re

file=urlopen('https://apps.popular.com/navs/rates_wm_modx.php?id_rates=1&t=1')
annual_interest = re.findall(r"\d+\.\d+", str(file.read()))[0]
#the annual interest is 2.75

相关问题 更多 >

    热门问题