① python 正則表達式 匹配多行聊天記錄的問題。
如果你所指得[任意文字]的意思是1個或1個以上文字得話
你可以試試下面得語句
p = re.compile(u'.*想知道.+\n.+也想知道.+')
否則你只需要將裡面得"+"改為"*"就可以匹配0得情況
也就是下面得語句
p = re.compile(u'.*想知道.*\n.*也想知道.*')
測試代碼如下:
>>>a = u"""我想知道。
..... 我也想知道。"""
>>>p.search(a)
>>><_sre.SRE_Match object at 0x1014d5100>
看了你的問題補充,如果你想要查找出字元串中最後匹配的子字元串的話,我目前沒想到比較好的辦法。
如果一定要用正則的話你可以考慮採用遍歷的方式,也就是匹配所有不含abc的情況。
比如說^a, ^b, ^c, ab^c, a^bc....等等等等。不過這樣以來正則表達式會顯得過於復雜,而且擴展行幾乎為0。
如果可以不用正則,那python本身的庫就能夠實現(可能你嫌處理語句過多或考慮到時間問題而不想用),而且邏輯也較為簡單(我覺得是這樣)。python的string類中自帶有find()和rfind()方法再加上split()方法,合理使用的話應該能找出所有的匹配子字元串。
② 如何用python寫一個簡單的12306搶票軟體
看看這個可以嗎功能:1:全自動爬所有車站列表2:爬所有車站之間的所有車次,過濾重復,保存文件爬過程中保存文件遇到http異常,停止繼續腳本代碼[python]viewplain#coding:utf-8__author__='watsy'#城市對象classcityObject(object):def__init__(self,abbr_pinyin="",full_pinyin="",chinaname="",shortCode=""):self.abbr_pinyin=abbr_pinyinself.full_piyin=full_pinyinself.chinaname=chinanameself.shortCode=shortCode#火車classtrainObject(object):def__init__(self,tid="",code="",start_city="",start_time="",end_city="",end_time="",full_time=""):self.tid=tidself.code=codeself.start_city=start_cityself.start_time=start_timeself.end_city=end_cityself.end_time=end_timeself.full_time=full_timedefget_writestr(self):#return("%s,%s,%s,%s,%s,%s,%s")%(self.tid,self.code,self.start_city.encode('utf-8'),self.start_time,self.end_city.encode('utf-8'),self.end_time,self.full_time)str_return=self.tid+",";str_return+=self.code+",";str_return+=self.start_city+",";str_return+=self.start_time+",";str_return+=self.end_city+",";str_return+=self.end_time+",";str_return+=self.full_time;returnstr_return#火車列表classtrainModel(list):defisExist(self,train):forsub_traininself:ifsub_train.code==train.code:returnTruereturnFalsedefsave(self):train=self[-1]withopen(("%s.txt")%(train.code),"w")aswf:printtrain.get_writestr()wf.write(train.get_writestr().encode('utf-8'))#解析城市defparserCitys(data):parser_citys=[]fororiginal_cityindata:iforiginal_cityandlen(original_city)>1:split_city=original_city.split('|')parser_city=cityObject(split_city[0],split_city[3],split_city[1],split_city[2])parser_citys.append(parser_city)printlen(parser_citys)returnparser_citys#生成url地址defgetBookingTrainListUrl(start_code,end_code,day):strUrl=("/otsquery/query/queryRemanentTicketAction.do?method=queryLeftTicket&")strUrl+=("orderRequest.train_date=%s&")%(day)strUrl+=("orderRequest.from_station_telecode=%s&")%(start_code)strUrl+=("orderRequest.to_station_telecode=%s&")%(end_code)strUrl+=("orderRequest.train_no=&trainPassType=QB&trainClass=QB%23D%23Z%23T%23K%23QT%23&includeStudent=00&seatTypeAndNum=&orderRequest.start_time_str=00%3A00--24%3A00")returnstrUrltrains=trainModel()#解析預定車次列表defparser_booking_str(str_booking):json_book=json.loads(str_booking)datas=json_book['datas']ifdatasandlen(datas)>1:#printdatas.replace("","")trainlist=datas.replace("","").split("\\n")fortrain_strintrainlist:train_str_list=train_str.split(',')iflen(train_str_list)==17:str_id_and_code=train_str_list[1]str_start_city_and_time=train_str_list[2]str_end_city_and_time=train_str_list[3]str_full_time=train_str_list[4]#printstr_id_and_codestr_id=str_id_and_code[13:25]str_code=str_id_and_code[131:-7]#printstr_start_city_and_timeiflen(str_start_city_and_time)>50:str_start_city=str_start_city_and_time[43:-9]else:str_start_city=str_start_city_and_time[0:-9]str_start_time=str_start_city_and_time[-5:]#printstr_end_city_and_timeiflen(str_end_city_and_time)>50:str_end_city=str_end_city_and_time[42:-9]else:str_end_city=str_end_city_and_time[0:-9]str_end_time=str_end_city_and_time[-5:]tobj=trainObject(str_id,str_code,str_start_city,str_start_time,str_end_city,str_end_time,str_full_time)iftrains.isExist(tobj)==False:trains.append(tobj)trains.save()#打開城市列表頁面u=urllib2.urlopen("mon/station_name.js?version=1.40")buffer=u.read()u.close()#獲取列表buffer=buffer[20:-3]unformatter_citys=buffer.split('@')#得到城市parser_citys=parserCitys(unformatter_citys)city_length=len(parser_citys)today=datetime.date.today()torrow=datetime.timedelta(days=1)today=today+torrowday_str=("%s-%02d-%02d")%(today.year,int(today.month),int(today.day))print(day_str)strPath=os.getcwd()os.chdir("%s/train/"%strPath)foriinrange(1,city_length):forjinrange(0,len(parser_citys)-i):try:print("[%d%d]"%(i,j))sleep(0.09)strurl=getBookingTrainListUrl(parser_citys[i].shortCode,parser_citys[j].shortCode,day_str)url_add_header=urllib2.Request(strurl)url_add_header.add_header('X-Requested-With',"XMLHttpRequest")url_add_header.add_header('Referer',"/otsquery/query/queryRemanentTicketAction.do?method=init")url_add_header.add_header('Content-Type','application/x-www-form-urlencoded')url_add_header.add_header('Connection','keep-alive')resp=urllib2.urlopen(url_add_header)urlread=resp.read()resp.close()parser_booking_str(urlread)excepturllib2.HTTPErroraserr:print("error:[%s]url=[%s]")%(err,strurl)exit(1)os.chdir(strPath)printlen(trains)
③ Python:這有可能是最詳細的PIL庫基本概念文章了
PIL有如下幾個模塊:Image模塊、ImageChops模塊、ImageCrackCode模塊、ImageDraw模塊、ImageEnhance模塊、ImageFile模塊、ImageFileIO模塊、ImageFilter模塊、ImageFont模塊、ImageGrab模塊、ImageOps模塊、ImagePath模塊、ImageSequence模塊、ImageStat模塊、ImageTk模塊、ImageWin模塊、PSDraw模塊
啊啊啊啊怎麼這么多模塊啊~~~!!!!
別擔心我為你一一講解
Image模塊提供了一個相同名稱的類,即image類,用於表示PIL圖像。
Image模塊是PIL中最重要的模塊 ,比如創建、打開、顯示、保存圖像等功能,合成、裁剪、濾波等功能,獲取圖像屬性功能,如圖像直方圖、通道數等。
Image模塊的使用如下:
ImageChops模塊包含一些算術圖形操作,這些操作可用於諸多目的,比如圖像特效,圖像組合,演算法繪圖等等,通道操作只用於8點陣圖像。
ImageChops模塊的使用如下:
由於圖像im_p是im的復制過來的,所以它們的差為0,圖像im_diff顯示時為黑圖。
ImageCrackCode模塊允許用戶檢測和測量圖像的各種特性。 這個模塊只存在於PIL Plus包中。
因為我目前安裝的PIL中沒有包含這個模塊。所以就不詳細介紹了
ImageDraw模塊為image對象提供了基本的圖形處理功能。 例如,它可以創建新圖像,注釋或潤飾已存在圖像,為web應用實時產生各種圖形。
ImageDraw模塊的使用如下:
在del draw前後顯示出來的圖像im是完全一樣的,都是在原有圖像上畫了兩條對角線。
原諒我的報錯
ImageEnhance模塊包括一些用於圖像增強的類。它們分別為 Color類、Brightness類、Contrast類和Sharpness類。
ImageEnhance模塊的使用如下:
圖像im0的亮度為圖像im的一半。
ImageFile模塊為圖像打開和保存功能提供了相關支持功能。另外,它提供了一個Parser類,這個類可以一塊一塊地對一張圖像進行解碼(例如,網路聯接中接收一張圖像)。這個類的介面與標準的sgmllib和xmllib模塊的介面一樣。
ImageFile模塊的使用如下:
因為所打開圖像大小大於1024個byte,所以報錯:圖像不完整。
所以大家想看的可以自行去找一個小一點的圖看一下
ImageFileIO模塊用於從一個socket或者其他流設備中讀取一張圖像。 不贊成使用這個模塊。 在新的code中將使用ImageFile模塊的Parser類來代替它。
ImageFilter模塊包括各種濾波器的預定義集合,與Image類的filter方法一起使用。該模塊包含這些圖像增強的濾器:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH,SMOOTH_MORE和SHARPEN。
ImageFilter模塊的使用如下:
ImageFont模塊定義了一個同名的類,即ImageFont類。這個類的實例中存儲著bitmap字體,需要與ImageDraw類的text方法一起使用。
PIL使用自己的字體文件格式存儲bitmap字體。用戶可以使用pilfont工具包將BDF和PCF字體描述器(Xwindow字體格式)轉換為這種格式。
PIL Plus包中才會支持矢量字體。
ImageGrab模塊用於將屏幕上的內容拷貝到一個PIL圖像內存中。 當前的版本只在windows操作系統上可以工作。
ImageGrab模塊的使用如下:
圖像im顯示出筆記本當前的窗口內容,就是類似於截圖的工具
ImageOps模塊包括一些「ready-made」圖像處理操作。 它可以完成直方圖均衡、裁剪、量化、鏡像等操作 。大多數操作只工作在L和RGB圖像上。
ImageOps模塊的使用如下:
圖像im_flip為圖像im垂直方向的鏡像。
ImagePath模塊用於存儲和操作二維向量數據。Path對象將被傳遞到ImageDraw模塊的方法中。
ImagePath模塊的使用如下:
ImageSequence模塊包括一個wrapper類,它為圖像序列中每一幀提供了迭代器。
ImageSequence模塊的使用如下:
後面兩次show()函數調用,分別顯示第1張和第11張圖像。
ImageStat模塊計算一張圖像或者一張圖像的一個區域的全局統計值。
ImageStat模塊的使用如下:
ImageTk模塊用於創建和修改BitmapImage和PhotoImage對象中的Tkinter。
ImageTk模塊的使用如下:
這個是我一直不太懂的有沒有大佬能幫我解決一下在線等~急!
PSDraw模塊為Postscript列印機提供基本的列印支持。用戶可以通過這個模塊列印字體,圖形和圖像。
PIL中所涉及的基本概念有如下幾個: 通道(bands)、模式(mode)、尺寸(size)、坐標系統(coordinate system)、調色板(palette)、信息(info)和濾波器(filters)。
每張圖片都是由一個或者多個數據通道構成。PIL允許在單張圖片中合成相同維數和深度的多個通道。
以RGB圖像為例,每張圖片都是由三個數據通道構成,分別為R、G和B通道。而對於灰度圖像,則只有一個通道。
對於一張圖片的通道數量和名稱,可以通過getbands()方法來獲取。getbands()方法是Image模塊的方法,它會返回一個字元串元組(tuple)。該元組將包括每一個通道的名稱。
Python的元組與列表類似,不同之處在於元組的元素不能修改,元組使用小括弧,列表使用方括弧,元組創建很簡單,只需要在括弧中添加元素,並使用逗號隔開即可。
getbands()方法的使用如下:
圖像的模式定義了圖像的類型和像素的位寬。當前支持如下模式:
1:1位像素,表示黑和白,但是存儲的時候每個像素存儲為8bit。
L:8位像素,表示黑和白。
P:8位像素,使用調色板映射到其他模式。
I:32位整型像素。
F:32位浮點型像素。
RGB:3x8位像素,為真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,顏色分離。
YCbCr:3x8位像素,彩色視頻格式。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。
可以通過mode屬性讀取圖像的模式。其返回值是包括上述模式的字元串。
mode 屬性 的使用如下:
通過size屬性可以獲取圖片的尺寸。這是一個二元組,包含水平和垂直方向上的像素數。
mode屬性的使用如下:
PIL使用笛卡爾像素坐標系統,坐標(0,0)位於左上角。注意:坐標值表示像素的角;位於坐標(0,0)處的像素的中心實際上位於(0.5,0.5)。
坐標經常用於二元組(x,y)。長方形則表示為四元組,前面是左上角坐標。例如:一個覆蓋800x600的像素圖像的長方形表示為(0,0,800,600)。
調色板模式 ("P")使用一個顏色調色板為每個像素定義具體的顏色值
使用info屬性可以為一張圖片添加一些輔助信息。這個是字典對象。載入和保存圖像文件時,多少信息需要處理取決於文件格式。
info屬性的使用如下:
對於將多個輸入像素映射為一個輸出像素的幾何操作,PIL提供了4個不同的采樣濾波器:
NEAREST:最近濾波。 從輸入圖像中選取最近的像素作為輸出像素。它忽略了所有其他的像素。
BILINEAR:雙線性濾波。 在輸入圖像的2x2矩陣上進行線性插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。
BICUBIC:雙立方濾波。 在輸入圖像的4x4矩陣上進行立方插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。
ANTIALIAS:平滑濾波。 這是PIL 1.1.3版本中新的濾波器。對所有可以影響輸出像素的輸入像素進行高質量的重采樣濾波,以計算輸出像素值。在當前的PIL版本中,這個濾波器只用於改變尺寸和縮略圖方法。
注意:在當前的PIL版本中,ANTIALIAS濾波器是下采樣 (例如,將一個大的圖像轉換為小圖) 時唯一正確的濾波器。 BILIEAR和BICUBIC濾波器使用固定的輸入模板 ,用於固定比例的幾何變換和上采樣是最好的。Image模塊中的方法resize()和thumbnail()用到了濾波器。
resize()方法的定義為:resize(size, filter=None)=> image
resize()方法的使用如下:
對參數filter不賦值的話,resize()方法默認使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現:
thumbnail ()方法的定義為:im.thumbnail(size, filter=None)
thumbnail ()方法的使用如下:
這里需要說明的是,方法thumbnail()需要保持寬高比,對於size=(200,200)的輸入參數,其最終的縮略圖尺寸為(182, 200)。
對參數filter不賦值的話,方法thumbnail()默認使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現:
④ 編寫python爬蟲,類搜索引擎的程序是否有意義
最初有一個想法,就是用程序來寫一個類似搜索引擎的爬蟲,然後24小時循環抓取互聯網上盡可能多的網站數據。
接著用這個數據來配合做seo。目前已經完成了24小時不間斷抓取Url部分。主要是用python做的。其他程序也試過。但是效率太低、要麼耗內存。還是python最好。
我的問題是:有沒有python方面經驗豐富的朋友? 能夠提供一些方向的? 比如正文提取這一部分,這個有現成的模塊嗎? 自己寫的話,有點難度。我查過資料,python有爬蟲類的模塊。但是還沒接觸過。希望能有前輩可以指導一下。真的,在此謝過了。
還有就是,想問下做這個東西你覺得有意義嗎?
【回復】
首先要肯定,你做這個開發是很有意義的。我去年的時候用C#開發過一個蜘蛛抓取系統和正文分析系統,雖然比較粗糙,但是也從過程中感悟到了更深刻SEO優化策略。
例如配額的問題,我在家裡自己架伺服器然後一個抓一個分析,一切都是以低費用原則展開的,所以帶寬自然是不充裕的。這個情況下我就深刻的意識到要抓什麼網站,要抓什麼類型的頁面,時間和線程怎麼分配比例,哪些內容是長期不更新的,哪些是具有實時更新意義的等等,通常做SEO的朋友,沒辦法真的換位去思考這些內容,所以只能等著別分享後再去思考,但是大多數分享也是淺嘗則止,具體的細節和原則還是需要自己去摸索和實驗的。
另外當我試圖去分析HTML的時候,就遇到了前所未有的「無限可能」,因為你的思路幾乎是瞬間爆炸了,什麼導航條麵包屑,頁面噪音(代碼層面,內容層面),HTML的標准化(涉及到DOM樹是否正確的解析),H1優化,尋找最大正文段落等等,太多的細節可以去做分析。
其中我做了一個關於頁面噪音的小測試,就是去試圖針對一個網站,通過對比HTML獲得類目框架。目的就是不想亂七八糟的內容影響我分析正文,所以這里要最基礎的去除噪音。這樣一來,周邊零散的代碼就被我視為「低質量的,可忽略的,重要性較低的」的內容。
又例如如何判斷頁面類型呢?列表頁和內容頁?不同的頁面也會影響二次抓取的頻率,因為列表頁很顯然更具備更新能力,而內容頁則相對不更新(主內容框架內不更新,周邊框架內容更新,但意義不大)。所以當搜索什麼「列車時刻」一類的詞,默認列表頁會有更大的機會,而當你搜索知識性內容則內容頁會有更大的可能性。當然這些都是可以通過系統設置的一個「偏重權重」來實現。
總的來說,當你開發一個搜索引擎的時候,哪怕這個搜索引擎再簡單和粗糙,你也會真正的有機會站在搜索引擎的角度去思考SEO,這種思考和感悟是深刻而實際的,遠比盲人摸象更有指導意義。
python中,有三個庫可以解析html文本,HTMLParser,sgmllib,htmllib。但是更推薦你試試BeautifulSoup。
關於正文的提取,不知道你是要所有正文文本的提取,還是最核心的內容的判斷。
如果是提取所有HTML標簽內的文本,那麼解析器遍歷一下,就可以獲得一個清單了。
如果你要獲得一個「相對最重要正文區域」,那麼就需要根據每一個DOM樹中的內容量做一個初步的判斷,當然如果要更准確無誤的判
斷正文,還需要其他很多細節的驗證操作。
順著你的話題,我在擴展一下。
我建議大家有時間可以閱讀有關「方_法_論」方面的書籍,因為通常,我們在一個行業或一個職位上,所關注和處理的工作,都是一個整
體系統中的一個局部,而是否能盡量多的去理解這個整體系統,對我們的控制能力來說,是至關重要的。所以真正要做好SEO,就不能
僅僅追求SEO的技巧,要更多時間去理解搜索引擎。
淘寶也好,亞馬遜(海外)也好,網路也好,都是一個平台,我們無論要做運營,還是SEO,其本質都是充分的獲得平台的資源分配。
這個時候誰能站在平台的角度,誰就有更大的競爭力。這就好比產品經理們常常說的,站在用戶的角度去開發產品。
你做這個事情,整個過程就是一個極其寶貴的學習過程,這樣做的人非常少,你很棒!加油!