当HTML不变时,如何用Python进行网页抓取?

1 投票
1 回答
1090 浏览
提问于 2025-04-18 13:11

我现在正在使用Selenium和BeautifulSoup来抓取谷歌财经上的财务报表数据。例如:

http://www.google.com/finance?q=GOOG&fstype=ii

这个链接会打开谷歌的收入报表。当我用Selenium点击页面顶部的“资产负债表”和“现金流量表”按钮时,页面上的图表和表格会发生变化,但网址并没有改变。而当我提取页面源代码时,得到的还是原来的收入报表的内容。我的代码如下:

driver = webdriver.Firefox()
driver.get("http://www.google.com/finance?q=" + ticker[0] + "&fstype=ii")

url1 = driver.page_source
soup1 = BeautifulSoup(url1)

element = driver.find_element_by_xpath('//*[@id=":1"]/a/b/b')
element.click()

driver.implicity_wait(3.0)
url2 = driver.page_source
soup2 = BeautifulSoup(url2)

element = driver.find_element_by_xpath('//*[@id=":2"]/a/b/b')
element.click()

driver.implicity_wait(3.0)
url3 = driver.page_source
soup3 = BeautifulSoup(url3)

driver.quit()

任何帮助都非常感谢。谢谢。

1 个回答

3

这里其实不需要用到 BeautifulSoup 这个HTML解析器。Selenium 本身就很强大,可以在网页上导航,并且几乎可以用你能想到的任何方式获取元素。

你需要的表格数据都在不同的 div 元素里,这些元素有不同的 id。你只需要激活每个标签页,然后从相应的 div 中获取数据。

下面是一个示例,展示了如何打印出所有标签页中表格的标题:

from selenium import webdriver

def print_header(element):
    table = element.find_element_by_id('fs-table')
    for row in table.find_elements_by_tag_name('th'):
        print row.text


driver = webdriver.Firefox()
driver.get('http://www.google.com/finance?q=GOOG&fstype=ii')

print_header(driver.find_element_by_id('incinterimdiv'))
print "----"

# activate Balance Sheet
element = driver.find_element_by_xpath('//*[@id=":1"]/a/b/b')
element.click()

print_header(driver.find_element_by_id('balinterimdiv'))
print "----"

# activate Cash Flow
element = driver.find_element_by_xpath('//*[@id=":2"]/a/b/b')
element.click()

print_header(driver.find_element_by_id('casinterimdiv'))

driver.quit()

输出结果:

In Millions of USD (except for per share items)
3 months ending 2014-03-31
3 months ending 2013-12-31
3 months ending 2013-09-30
3 months ending 2013-06-30
3 months ending 2013-03-31
----
In Millions of USD (except for per share items)
As of 2014-03-31
As of 2013-12-31
As of 2013-09-30
As of 2013-06-30
As of 2013-03-31
----
In Millions of USD (except for per share items)
3 months ending 2014-03-31
12 months ending 2013-12-31
9 months ending 2013-09-30
6 months ending 2013-06-30
3 months ending 2013-03-31

撰写回答