如何用Python选择特定的网页表

时间:2015-12-23 08:53:20

标签: python beautifulsoup urllib

我是编程和python的新手。但我想在我的python脚本中解析HTML。

这是网页: http://stock.finance.sina.com.cn/hkstock/finance/00759.html

问题1

此页面是关于特定分享的财务信息。这四个表是关于:

  1. 财务摘要,
  2. 资产负债表,
  3. 现金流量
  4. 损益表。
  5. 我想提取表3和表3中的信息。这是我的代码:

    import urllib
    from bs4 import BeautifulSoup
    
    url = 'http://stock.finance.sina.com.cn/hkstock/finance/00759.html'
    
    html = urllib.urlopen(url).read()   #.read() mean read all into a string
    soup = BeautifulSoup(html, "lxml")
    
    table = soup.find("table", { "class" : "tab05" })
    for row in table.findAll("tr"):
        print row.findAll("td")
    

    但是这段代码只能得到第一个表信息。如何更改代码以获取第三个和第四个表信息?我发现那4个表不包含唯一的id或classname,我不知道如何找到它们....

    问题2:

    这也是简化中文网页,如何保持原文输出?

    问题3:

    在每张桌子的右上角,有一个下拉菜单,用于选择适当的时间段,即:"全部" "全部年" "半年" "第一季度" "第三季度" urllib是否可以更改此下拉菜单?

    非常感谢。

2 个答案:

答案 0 :(得分:1)

根据该网站,所有四个表都有类名" tab05"。

因此,您只需在.find处将.findAll方法更改为soup,即可访问所有四个表。

import urllib
from bs4 import BeautifulSoup

url = 'http://stock.finance.sina.com.cn/hkstock/finance/00759.html'
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html, "lxml")

tables = soup.findAll("table", { "class" : "tab05" })
print len(tables) #4

for table in tables:
    for row in table.findAll("tr"):
        for col in row.findAll("td"):
            print col.getText()

对于简化中文的编码,print col.getText()将在终端上获得正确的单词。如果您正在寻找将它们写入文件,则必须将字符串编码为gb2312。

f.write(col.getText().encode('gb2312'))

对于第3个问题,由于数据是用datatable.js编写的javascript函数呈现的,我认为不可能只用urllib来获取所有这些数据。更好地查看一些其他库以找到合适的用法。

答案 1 :(得分:0)

感谢您的回复。 我可能会误解你的意思。我重写代码如下:

QHeaderView::Stretch

" len(表格)"的结果是1.只能访问第一个表。 我发现如果我使用

tables = soup.findAll("table", { "class" : "tab05" })

print len(tables)

for row in tables[0].findAll("tr"):
    for col in row.findAll("td"):
        print col.getText()

我无法获得该表的所有信息。从这段代码得到的最后一个数字是" -45.7852",这只是该表的一半。