无法使用 BeautifulSoup 抓取嵌套的 html
Can't scrape nested html using BeautifulSoup
我有兴趣从 http://hdsc.nws.noaa.gov/hdsc/pfds/pfds_map_cont.html?Lat=33.146425&Lon=-87.5805543 的以下源代码中抓取“0.449”。
<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 的内容时,我的结果只是“-”。如何从这段代码中获取我想要的值?
您可能正在抓取使用 javascript 在初始加载后更新 DOM 的网站。
你有几个选择:
- 找出填充 HTML 页面的 javascript 代码从何处获取数据并改为调用它。数据很可能来自 API,您可以使用 CURL 直接调用它。在 99% 的情况下,这是最好的方法。
- 使用无头浏览器 (zombie.js, ...) 在 javascript 更改后检索 HTML 代码。方便快捷,但 python 中很少有工具可以做到这一点 (google
python headless browser
)。
- 使用 selenium 或 splinter 远程控制真正的浏览器(chrome、firefox 等)。它很方便,可以在 python 中使用,但速度非常慢
编辑:
我没看到你发布了你想要抓取的url。
在您的特定情况下,您想要的数据来自对此 URL:
的 AJAX 调用
您现在只需要了解每个参数的作用,并解析其输出,而不是编写 HTML scraper.
请原谅缺乏错误检查和模块化,但根据@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]
我有兴趣从 http://hdsc.nws.noaa.gov/hdsc/pfds/pfds_map_cont.html?Lat=33.146425&Lon=-87.5805543 的以下源代码中抓取“0.449”。
<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 的内容时,我的结果只是“-”。如何从这段代码中获取我想要的值?
您可能正在抓取使用 javascript 在初始加载后更新 DOM 的网站。
你有几个选择:
- 找出填充 HTML 页面的 javascript 代码从何处获取数据并改为调用它。数据很可能来自 API,您可以使用 CURL 直接调用它。在 99% 的情况下,这是最好的方法。
- 使用无头浏览器 (zombie.js, ...) 在 javascript 更改后检索 HTML 代码。方便快捷,但 python 中很少有工具可以做到这一点 (google
python headless browser
)。 - 使用 selenium 或 splinter 远程控制真正的浏览器(chrome、firefox 等)。它很方便,可以在 python 中使用,但速度非常慢
编辑:
我没看到你发布了你想要抓取的url。
在您的特定情况下,您想要的数据来自对此 URL:
的 AJAX 调用您现在只需要了解每个参数的作用,并解析其输出,而不是编写 HTML scraper.
请原谅缺乏错误检查和模块化,但根据@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]