HTML正文存储为两种格式:JSON和CSV。

存储为JSON:

  • 首先利用Requests访问http://seputu.com获取HTML文档:
#!coding:utf-8
import requests
import json
from bs4 import BeautifulSoup
user_agent = \'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)\'
headers = {\'User-agent\': user_agent}
r = requests.get(\'http://seputu.com\',headers)
r.encoding="utf-8"#指定编码方式
print r.text
  • 取每章节<div class=”mulu”>中的h2标签和<div class=”box”>中的<a>中
soup = BeautifulSoup(r.text,\'html.parser\',from_encoding=\'utf-8\')
for mulu in soup.find_all(class_="mulu"):
    h2 = mulu.find(\'h2\')
    if h2!=None:
        h2_title = h2.string#获取标题
        for a in mulu.find(class_=\'box\').find_all(\'a\'):#获取所有的a标签中url和章节内容
            href = a.get(\'href\')
            box_title = a.get(\'title\')
            print href,box_title

接下来将数据存储为JSON。

  • python对JSON文件的操作分为编码和解码,通过JSON模块实现,编码是指python对象转换成JSON对象过程,使用的函数是dumps和dump。两个函数区别在于dump把python对象转换成JSON对象,并将JSON对象通过fp文件流入文件中,而dumps则生成一个字符串:
  dumps (obj,skipkeys=False, ensure. ascii=True, check_ circular=True,
  allow_ nan=True, c1s=None, indent =None, separators=None,encoding= \'utf-8\',  de fault=None, sort_ keys=False, **kw)
  dump(obj, fp, skipkeys=False, ensure_ ascii=True, check_ circular=True ,
  allow_ nan=True, cls=None, indent=None, separators=None,encoding=\'utf-8\', default=None, sort_ keys=False, **kw) :
  常用参数分析:
  口Skipkeys:默认值是False。如果dict的keys内的数据不是python的基本类型( str、
  unicode、int、 long、 float、 bool、 None), 设置为False时,就会报TypeError错误。此时设置成True,则会跳过这类key。

  口ensure ascii:默认值True。如果dict内含有非ASCII的字符,则会以类似“\uXXXX”
  的格式显示数据,设置成False后,就能正常显示。

  口indent:应该是一一个非负的整型, 如果是0,或者为空,则一行显示数据,否则会换行
  且按照indent的数量显示前面的空白,将JSON内容进行格式化显示。

  口separators:分隔符,实际上是( tem separator, dict separator) 的一个元组, 默认的就是
  .),这表示dictionary内keys之间用“,”隔开,而key和value之间用“:”隔开。

  口encoding:默认是UTF-8。设置JSON数据的编码方式,在处理中文时一一定要注意。

  sort. keys:将数据根据keys的值进行排序。

  • 总的代码
#!coding:utf-8
import requests
import json
from bs4 import BeautifulSoup
user_agent = \'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)\'
headers = {\'User-agent\': user_agent}
r = requests.get(\'http://seputu.com\',headers)
r.encoding="utf-8"
print r.text
content=[]
soup = BeautifulSoup(r.text,\'html.parser\',from_encoding=\'utf-8\')
for mulu in soup.find_all(class_="mulu"):
    h2 = mulu.find(\'h2\')
    if h2!=None:
        h2_title = h2.string#获取标题
        list=[]
        for a in mulu.find(class_=\'box\').find_all(\'a\'):#获取所有的a标签中url和章节内容
            href = a.get(\'href\')
            box_title = a.get(\'title\')
            print href,box_title
            list.append({\'href\':href,\'box_title\':box_title})
        content.append({\'title\':h2_title,\'content\':list})
with open(\'guguobao.json\',\'wb\') as fp:
    json.dump(content,fp=fp,indent=4)

解码过程是把json对象转换成python对象的一个过程,常见函数是load和loads函数,区别和dump与dumps是一样的,函数原型:

loads (s,encoding=None, cls=None,object_ hook=None, parse_ float =None ,parse_ int =None,parse_ constant=None, object_ pairs_ hook=None, * * kw)
load(fp,encoding=None, cls=None, object_ hook=None, parse_ float =None,parse_ int=None, parse_ constant=None, object_ pairs_ hook=None, **kw)

常用参数分析:
encoding:指定编码格式。
parse float: 如果指定,将把每一个JSON字符串按照float 解码调用。默认情况下,
这相当于float(num str)。
口
parse int: 如果指定,将把每一个JSON字符串按照int解码调用。默认情况下,这相
当于int(num str)。
示例如下:

new_ str=json.loads (json_ str)
print new_ str
with open(\'guguobao.txt\', \'r\') as fp:
    print json.load(fp)


输出结果:
[{u username\': u\'\u4e03\u591c\', u\'age\': 24},[2,3], 11]
[{u username\': u\'\u4e03\u591c\', u\'age\': 24},[2,3],11]
    

通过上面的例子可以看到,Python的一些基本类型通过编码之后,tuple类型就转成了list类型了,再将其转回为python对象时,list 类刑也并没有转回成tuple类型,而且编码格式也发生了变化,变成了Unicode编码。具体转化时,类型变化规则如表5-1和表5-2所示。

表5-1 Python –> JSON

Python JSON
dict Object
list, tuple array
str, unicode string
int, long, float number
True true
Flase false
None null

表5-2 JSON —>Python

JSON Python
object dict
array list
string unicode
number (int) int, long
number (real ) float
true True
false False
nu11 None

版权声明:本文为guguobao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/guguobao/p/9512696.html