① 我的fft python中的錯誤問題,怎麼解決
Traceback(mostrecentcalllast):File"",line26,infoofor(event,elem)inxmlit:File"C:\Python32\lib\xml\etree\ElementTree.py",line1314,in__next__self._parser.feed(data)File"C:\Python32\lib\xml\etree\ElementTree.py",line1668,infeedself._parser.Parse(data,0)UnicodeEncodeError:'utf-8'codeccan'tencodecharacter'\ud800'inposition16383:surrogatesnotallowed由於出現錯誤之間for循環迭代,我可以包裝一個唯一的地方try塊以外的for循環,這是我無法繼續到下一個XML是我的一個解決方案的優先事項如下:接收,而不必引發異常的未必然,有效的Unicode字元串作為文本。收到一個有效的Unicode字元串的字元無效更換或取出。跳過的無效字元CodeGo.net,並移動到下一個。我怎麼能這些解決方案中,而不必和修改ElementTree編寫自己?本文地址:CodeGo.net/9075227/-------------------------------------------------------------------------------------------------------------------------1.首先,所有的東西對可能這里無關緊要。嘗試僅僅通過返回的文件f=open(filename,encoding='utf-8')如果是的話,解決的法是重寫默認編碼錯誤處理程序,如在文檔解釋說:錯誤是一個可選的字元串,用於指定編碼和解碼的錯誤是如何被handled,Äìthis不能以二進制方式。經過「strict」提出一個ValueError異常,如果有一個編碼錯誤(沒有默認有作用),或者通過「忽略」忽略錯誤。(請注意CodeGo.net,忽略編碼錯誤會導致數據丟失。)'代替'的標記(如「?」)插入那裡的數據。寫作時,「xmlcharrefreplace」(替換為相應的XML字元引用)或「backslashreplace'(用反斜杠轉義序列替換)可以在已注冊codecs.register_error()其他錯誤處理也是有效的。所以,你可以這樣做:f=open(filename,encoding='utf-8',errors='replace')這符合你的第二個priority,Äîthe無效字元將被替換'?'。有沒有法來滿足你的首要任務,有沒有法來表示「不必然,有效的Unicode字元串」.a個Unicode字元串,顧名思義,對Unicode代碼點的序列,這就是Python中如何對待str類型。如果你有無效的UTF-8,並希望把它轉換成一個字元串,你需要指定應該如何變成string,Äîand那是什麼,errors是。你可以,或者,以二進制方式打開該文件,息事寧人為UTF-8作為bytes對象,而不是試圖把它變成一個Unicodestr反對,但你可以在與工作的APIbytes對象。(我相信lxml的ElementTree能真正做到這一點,但內置一不可,但不要說)。但即使你這樣做,它不會讓你很遠.xML代碼本身將試圖解釋無效的UTF-8,然後它需要知道你想要做什麼樣的錯誤,而這將是很難說明它的更遠了。最後一點:因為發生錯誤的for循環迭代之間,唯一的地方,我可以換一個try塊外循環,這是我無法繼續到下一個XML那麼,你實際上並不具有for環;你可以把它變成一個while環路明確next調用。所有你需要做這個,我知道你正在做wrong,Äîbut那就是你正在處理一個破碎庫的標志,它是唯一可用的解決方法的一個標志。這一點:for(event,elem)inxmlit:#line26doStuffWith(event,elem)實際上等同於:whileTrue:try:event,elem=next(xmlit)exceptStopIteration:breakdoStuffWith(event,elem)而現在,有添加的地方try,Äîalthough你甚至不真正需要;你可以附加其他except在現有try。問題是,你有什麼打算在這里做?誰也不能保證iterator就可以繼續它拋出一個異常後。事實上,所有的最簡單的方法來創建iterator將不能夠這樣做。你可以為自己測試是否這是真的在這種情況下。在極少數情況下,當你需要這個,而它實際上幫助,你可能想要把它包起來。像這樣:defskip_exceptions(it):whileTrue:try:yieldnext(it)exceptStopIteration:raiseexceptExceptionase:logging.info('{}'.format(e))然後,你只是做:for(event,elem)inskip_exceptions(xmlit):doStuffWith(event,elem)本文標題:如何解決Unicode的錯誤xml.etree.ElementTree.iterparse()?本文地址:CodeGo.net/9075227/1.sqlite3的ORDERBY需要時間2.只有在Emacs的Python命令行為什麼UnicodeEncodeError長大的嗎?3.Memcached的不尊重的元組排序4.解析HTML使用QWebElement,如何提取圖像?5.在__init__中聲明的變數似乎是類實例之間共享?6.Python2.6中我有兩個文件。SysDump.py和li7.為什麼一個特定的導入看到其他導入?Python2.6中8.創建具有PyGTK的屏幕保護程序的使用XScreenSaver9.與目錄工作|python10.從字元串轉換為元組和QUOT;\\"在python
② Python筆記:命令行參數解析
有些時候我們需要通過命令行將參數傳遞給腳本,C語言中有個getopt()方法,python中也有個類似的命令行參數解析方法getopt()。python也提供了比getopt()更簡潔的argparse方法。另外,sys模塊也可以實現簡單的參數解析,本文將對這3種命令行參數解析方法簡要介紹。
sys.argv是傳入的參數列表,sys.argv[0]是當前python腳本的名稱,sys.argv[1]表示第一個參數,以此類推。
命令行運行:
可以看到傳入的參數通過sys.argv來獲取,它就是一個參數列表。
python的getopt與C語言的的getopt()函數類似。相比於sys模塊,支持長參數和短參數,並對參數解析賦值。但它需要結合sys模塊進行參數解析,語法格式如下:
短參數為單個英文字母,如果必須賦值需要在後面加英文冒號( : ),長參數一般為字元串(相比短參數,更能說明參數含義),如果必須賦值需要在後面加等號( = )。
命令行運行:
注意:短參數(options)和長參數(long_options)不需要一一對應,可以任意順序,也可以只有短參數或者只有長參數。
argparse模塊提供了很多可以設置的參數,例如參數的默認值,幫助消息,參數的數據類型等。argparse類主要包括ArgumentParser、add_argument和parse_args三個方法。
下面介紹這三個函數的使用方法。
argparse默認提供了 -h | --help 參數:
命令行運行:
下面列出部分參數:
下面來添加參數:
命令行運行:
parse_args() 方法用於解析參數,在前面的示例代碼中使用parse_args方法來提取參數值,對於無效或者錯誤的參數會列印錯誤信息和幫助信息:
命令行運行:
本文介紹了Python的三種命令行參數解析方法sys.argv、getopt和argparse,可以根據自己的需要進行選擇,getopt和argparse兩種方法相比來說,建議選擇argparse,代碼量更少更簡潔。更詳細的使用方法參考官方文檔:
--THE END--
③ 如何用Python爬取搜索引擎的結果
我選取的是爬取網路知道的html 作為我的搜索源數據,目前先打算做網頁標題的搜索,選用了 Python 的 scrapy 庫來對網頁進行爬取,爬取網頁的標題,url,以及html,用sqlist3來對爬取的數據源進行管理。
爬取的過程是一個深度優先的過程,設定四個起始 url ,然後維護一個資料庫,資料庫中有兩個表,一個 infoLib,其中存儲了爬取的主要信息:標題,url ,html;另一個表為urlLib,存儲已經爬取的url,是一個輔助表,在我們爬取每個網頁前,需要先判斷該網頁是否已爬過(是否存在urlLib中)。在數據存儲的過程中,使用了SQL的少量語法,由於我之前學過 MySQL ,這塊處理起來比較駕輕就熟。
深度優先的網頁爬取方案是:給定初始 url,爬取這個網頁中所有 url,繼續對網頁中的 url 遞歸爬取。代碼逐段解析在下面,方便自己以後回顧。
1.建一個 scrapy 工程:
關於建工程,可以參看這個scrapy入門教程,通過運行:
[python] view plain
scrapy startproject ***
在當前目錄下建一個scrapy 的項目,然後在 spiders 的子目錄下建立一個 .py文件,該文件即是爬蟲的主要文件,注意:其中該文件的名字不能與該工程的名字相同,否則,之後調用跑這個爬蟲的時候將會出現錯誤,見ImportError。
2.具體寫.py文件:
[python] view plain
import scrapy
from scrapy import Request
import sqlite3
class rsSpider(scrapy.spiders.Spider): #該類繼承自 scrapy 中的 spider
name = "" #將該爬蟲命名為 「知道」,在執行爬蟲時對應指令將為: scrapy crawl
#download_delay = 1 #只是用於控制爬蟲速度的,1s/次,可以用來對付反爬蟲
allowed_domains = ["..com"] #允許爬取的作用域
url_first = 'http://..com/question/' #用於之後解析域名用的短字元串
start_urls = ["http://..com/question/647795152324593805.html", #python
"http://..com/question/23976256.html", #database
"http://..com/question/336615223.html", #C++
"http://..com/question/251232779.html", #operator system
"http://..com/question/137965104.html" #Unix programing
] #定義初始的 url ,有五類知道起始網頁
#add database
connDataBase = sqlite3.connect(".db") #連接到資料庫「.db」
cDataBase = connDataBase.cursor() #設置定位指針
cDataBase.execute('''''CREATE TABLE IF NOT EXISTS infoLib
(id INTEGER PRIMARY KEY AUTOINCREMENT,name text,url text,html text)''')
#通過定位指針操作資料庫,若.db中 infoLib表不存在,則建立該表,其中主鍵是自增的 id(用於引擎的docId),下一列是文章的標題,然後是url,最後是html
#url dataBase
cDataBase.execute('''''CREATE TABLE IF NOT EXISTS urlLib
(url text PRIMARY KEY)''')
#通過定位指針操作資料庫,若.db中urlLib表不存在,則建立該表,其中只存了 url,保存已經爬過的url,之所以再建一個表,是猜測表的主鍵應該使用哈希表存儲的,查詢速度較快,此處其實也可以用一個外鍵將兩個表關聯起來
2. .py文件中的parse函數:
.py文件中的parse函數將具體處理url返回的 response,進行解析,具體代碼中說明:
[python] view plain
def parse(self,response):
pageName = response.xpath('//title/text()').extract()[0] #解析爬取網頁中的名稱
pageUrl = response.xpath("//head/link").re('href="(.*?)"')[0] #解析爬取網頁的 url,並不是直接使用函數獲取,那樣會夾雜亂碼
pageHtml = response.xpath("//html").extract()[0] #獲取網頁html
# judge whether pageUrl in cUrl
if pageUrl in self.start_urls:
#若當前url 是 start_url 中以一員。進行該判斷的原因是,我們對重復的 start_url 中的網址將仍然進行爬取,而對非 start_url 中的曾經爬過的網頁將不再爬取
self.cDataBase.execute('SELECT * FROM urlLib WHERE url = (?)',(pageUrl,))
lines = self.cDataBase.fetchall()
if len(lines): #若當前Url已經爬過
pass #則不再在資料庫中添加信息,只是由其為跟繼續往下爬
else: #否則,將信息爬入資料庫
self.cDataBase.execute('INSERT INTO urlLib (url) VALUES (?)',(pageUrl,))
self.cDataBase.execute("INSERT INTO infoLib (name,url,html) VALUES (?,?,?)",(pageName,pageUrl,pageHtml))
else: #此時進入的非 url 網頁一定是沒有爬取過的(因為深入start_url之後的網頁都會先進行判斷,在爬取,在下面的for循環中判斷)
self.cDataBase.execute('INSERT INTO urlLib (url) VALUES (?)',(pageUrl,))
self.cDataBase.execute("INSERT INTO infoLib (name,url,html) VALUES (?,?,?)",(pageName,pageUrl,pageHtml))
self.connDataBase.commit() #保存資料庫的更新
print "-----------------------------------------------" #輸出提示信息,沒啥用
for sel in response.xpath('//ul/li/a').re('href="(/question/.*?.html)'): #抓出所有該網頁的延伸網頁,進行判斷並對未爬過的網頁進行爬取
sel = "http://..com" + sel #解析出延伸網頁的url
self.cDataBase.execute('SELECT * FROM urlLib WHERE url = (?)',(sel,)) #判斷該網頁是否已在資料庫中
lines = self.cDataBase.fetchall()
if len(lines) == 0: #若不在,則對其繼續進行爬取
yield Request(url = sel, callback=self.parse)
④ python用suds 調用webservice方法的時候報錯。
其實用Python進行webservice通信進行數據交換,就是拼接字元串,沒必要用第三方的庫。
⑤ Python 命令行(三)- 命令行參數解析
Python 標准庫中的 argparse 可以根據程序中的定義,從 sys.argv 中解析參數,並且自動生成幫助信息。
使用 add_argument 方法為應用程序添加參數,其中 add_argument 方法的參數比較多,這也使得 argparse 庫的使用不夠簡潔,後續將繼續為大家介紹更好用的命令行參數解析的開源庫 click 。
下面是 add_argument 方法的參數及含義總結:
解析參數需要使用 ArgumentParser 實例的 parse_args 方法,此方法返回一個 NameSpace 對象;可以通過訪問 NameSpace 對象屬性的方式獲取參數值。
下面是一個簡單的例子:通過 parser.server 獲取 --host 選項的值,通過 parse.boolean_switch 獲取 -t 選項的值。
查看幫助信息:
參數默認值:
指定參數:
列印幫助信息:
列印版本信息:
傳遞參數: