BeautifulSoup:通过类属性抓取表格 - 为什么我没有数据?

0 投票
2 回答
795 浏览
提问于 2025-04-18 08:30

我正在尝试使用BeautifulSoup从这个链接抓取股票代码。目前,我尝试了以下代码:

import urllib
import BeautifulSoup
import re

url  = r'https://investor.vanguard.com/mutual-funds/vanguard-mutual-funds-list'
html = urllib.urlopen(url).read()
soup = BeautifulSoup.BeautifulSoup(html)

table = soup.findAll('td', attrs = {'class': re.compile(r'\bticker left\b')})

但是,这并没有给我任何结果。有人能解释一下为什么我无法获取所有带有这个属性的标签吗?从HTML来看,似乎应该可以做到,而且应该很简单。例如:

<td class="ticker left">VUSXX              </td>

谢谢。

2 个回答

1

这是因为你看到的页面是通过AJAX动态加载的。所以用Beautiful Soup读取的时候,抓取不到稍后动态加载的AJAX数据。

你可以使用Mechanize(Python中的一个浏览器)和BeautifulSoup来做到这一点。

或者,你可以在AJAX请求完成后,复制HTML页面的数据,然后用BeautifulSoup来解析这些数据。

2

接着我之前的评论... 你可以使用下面这个网址,它会返回你需要的数据(这个数据是通过Firefox浏览器的Live HTTP Header扩展获取的)

https://api.vanguard.com/rs/ire/02/ind/mf/month-end.jsonp?callback=callback

--

你也可以使用Selenium,它是一个可以用来控制Firefox浏览器的工具。

1) 首先安装Selenium IDE,下载链接在这里:http://docs.seleniumhq.org/download/

2) 然后安装Selenium的Python模块,下载链接在这里:https://pypi.python.org/pypi/selenium

接下来你可以使用下面的脚本,它会打开Firefox浏览器并获取结果。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import re
from bs4 import BeautifulSoup #use bs4 from now on.

browser = webdriver.Firefox()

browser.get('https://investor.vanguard.com/mutual-funds/vanguard-mutual-funds-list')

html = browser.page_source
soup = BeautifulSoup(html)

mydata = soup.find_all('tr')

而且,你可以在 mydata 中找到你想要的内容。

撰写回答