当元素肯定存在时,BeautifulSoup返回none

时间:2017-11-03 16:29:37

标签: python html beautifulsoup nonetype

我是网络抓狂的新手,并且一直在使用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)

4 个答案:

答案 0 :(得分:4)

如果您检查网页来源(例如通过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>

您可以按照脚本网址进行操作,然后您会看到响应类似于以下内容:

document.write('<div>2.75%</div>')

这个响应可能足够常规,可以在其上使用正则表达式。

答案 1 :(得分:3)

正如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

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

我猜测textcolorbackgroundcolor表示css信息,所以我删除了它们,发现网址仍然有效。

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

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

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

t=1表示Annual interestt=2表示APRt=6表示P&I Payment等:

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

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

答案 2 :(得分:2)

要获得您以后的数据,可以将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()

结果:

2.75%

答案 3 :(得分:0)

使用 pip install html5lib 但我认为使用“pip install bs4(beautifulSoup)一切都应该自动安装添加 beautifulsooup 和 html5lib html5lib 就像解析器,它与 HTML.parser 相同。两者都是解析器以获得更多信息,这里是 beautifulsoup 文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser