1. 解析当当网图书查询网页
要解析数据,先要分析HTML的DOM结构,我们可以直接使用浏览器在当当网上查询图书后,在页面任意位置右键鼠标,在快捷菜单中选择“检查(inspect)”,选择“元素(Elements)”选项卡就可以看到我们通过程序查询返回的HTML文件内容了。
下图就是以“python”为关键字查询的结果。

仔细观察HTML文档会发现,所有的图书查询结果都包含在一个<ul></ul>标签对中,而每一本图书的信息包含在<ul>包含的<li></li>标签对中。对数据的解析,就是沿着HTML的DOM结构,抽茧剥丝地找到我们最终需要的图书信息数据项。
BeautifulSoup类为我们提供了使用程序对HTML的操作接口,但BeautifulSoup需要提供一个HTML格式的解析器,这里为了简单,使用了Python自带的“html.parser”解析器。核心代码如下:
html_text = BeautifulSoup(self.search_book(), "html.parser")
# 通过HTML标签的属性特征来查找元素/element
# <ul class="bigimg" id="component_59"></ul>
# book_doc = html_text.find(id="component_59")
# bs4的find()方法根据tag名、属性等查找元素
book_doc = html_text.find(name='ul', attrs={'class': ['bigimg'],'id': 'component_59'})
# 每个li标签,就是一本图书的数据
# bs4的select()方法获得一个element/tag的列表
for book_tag in book_doc.select('li'):
# 实例化Book对象
book = Book()
# 搜索文档树
# <p class="name" name="title">该节点图书名称广告太多
book.title = book_tag.a['title']
# <p class="search_book_author">
# 包括作者、出版日期、出版社等3个<span>
# book_info = book_tag.select('p[class="search_book_author"]')
book_info = book_tag.find(name='p',class_='search_book_author').text
……
2. JSON格式保存数据
爬取的当当网的数据需要以JSON格式的方式写入文件中,之前我们已经学习知道json.dump( )方法可以实现,它能将Python对象转换为适当的json对象,但我们这里是自定义的Book对象。如何让Python知道我们自己定义的对象与JSON对象之间的转换映射关系了?需要通过改写json.JSONEncoder类的default(self, obj)成员方法来实现。具体代码如下。

json模块的JSONEncoder类用于实现Python数据结构的可扩展JSON编码器,它默认支持Python的基本数据类型,对我们自己定义的类就需要显示的指明转换器了。