无法使用BeautifulSoup刮取嵌套的html

时间:2016-04-26 13:01:54

标签: python html web-scraping beautifulsoup bs4

我有兴趣刮刮" 0.449"来自http://hdsc.nws.noaa.gov/hdsc/pfds/pfds_map_cont.html?Lat=33.146425&Lon=-87.5805543的以下源代码。

<td class="tblInner" id="0-0">
    <div style="font-size:110%">
        <b>0.449</b>
    </div>
    "(0.364-0.545)"
</td>

使用BeautifulSoup,我目前写道:

storm=soup.find("td",{"class":"tblInner","id":"0-0"})

导致:

<td class="tblInner" id="0-0">-</td>

我不确定为什么嵌套在td中的所有内容都没有显示出来。当我搜索td的内容时,我的结果只是&#34; - &#34;。如何从此代码中获取我想要的值?

2 个答案:

答案 0 :(得分:1)

您可能会在初始加载后抓取使用javascript更新DOM的网站。

您有几个选择:

  • 找出填充HTML页面的javascript代码从哪里获取数据并调用它。数据最有可能来自您可以直接使用CURL调用的API。 99%的情况下,这是最好的方法。
  • 使用无头浏览器(zombie.js,...)在javascript更改后检索HTML代码。方便快捷,但python中的工具很少(google python headless browser)。
  • 使用selenium或splinter来远程控制真正的浏览器(chrome,firefox,...)。它很方便,可以在python中运行,但很慢,因为地狱

修改

我没有看到您发布了想要废弃的网址。

在您的特定情况下,您想要的数据来自对此URL的AJAX调用:

http://hdsc.nws.noaa.gov/cgi-bin/hdsc/new/cgi_readH5.py?lat=33.1464&lon=-87.5806&type=pf&data=depth&units=english&series=pds

您现在只需要了解每个参数的作用,并解析其输出,而不是编写HTML剪贴板。

答案 1 :(得分:0)

请原谅我没有错误检查和模块化,但根据@Eloims观察结果,这可以满足您的需求:

import requests
import re

url = 'http://hdsc.nws.noaa.gov/cgi-bin/hdsc/new/cgi_readH5.py?lat=33.1464&lon=-87.5806&type=pf&data=depth&units=english&series=pds'

r = requests.get(url)
response = r.text

coord_list_text = re.search(r'quantiles = (.*);', response)
coord_list = eval(coord_list_text.group(1))

print coord_list[0][0]