当HTML不变时,如何用Python进行网页抓取?
我现在正在使用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