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 |