前面的文章中,我们已经把网页抓取下来了,这一篇中我们看看如何网页中的内容解析成结构化的数据。

这次我们以网易财经的新股申购页面作为例子。新股申购页面的URL是:http://quotes.money.163.com/data/ipo/shengou.html

图:已经抓取的网页数据

要解析网页数据,比较优雅的方式是利用Beautiful Soup库。

一、安装Beautiful Soup

安装很简单,在命令行窗口中执行以下命令即可。

pip3 install bs4

另外,Beautiful Soup对lxml有依赖,如果没安装过的话,可以一起安装了。

pip3 install lxml

二、解析网页

首先,把网页内容传入Beautiful Soup对象中。

# 从bs4库中导入BeautifulSoup类
from bs4 import BeautifulSoup

# 创建一个bs对象,第一个参数是网页内容,第二个参数是解析库(一般传lxml即可)
bs = BeautifulSoup(req.text, 'lxml')

接下来,根据网页的特征,从bs对象中读取网页的各个字段。

# 我们发现真正的新股数据,都分布在一个id是plate_performance的table中,所以先定位到这个table
tab = bs.find(id="plate_performance")

# 循环table中所有的行(tr标签)
for idx,row in enumerate(tab.find_all("tr")):
    # 第一行是表头,忽略掉
    if 0 == idx:
        continue
        
    # 把这一行中所有的单元格(td)先放在一个数组中
    tds = [td for td in row.find_all("td")]
    
    # 申购代码的索引是1,发行日的索引是4。
    # 注意:Python中数组索引是从0开始的,申购代码位于第2列,所以索引是1。
    code = tds[1].text
    date = tds[4].text
    
    # 打印出来,看对不对
    print("%d. %s %s"%(idx, code, date))

执行之后,可以看到申购代码和发行日期已经被我们打印出来了。

截图:打印出的新股列表片段

以上就是用Beautiful Soup解析网页的全部内容了。可以看到,这个库用起来非常简单,几行代码就能解析出想要的数据。这里只举了一个简单的例子,关于 Beautiful Soup的详细用法,可以自行百度一下。