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 |