日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
如何用Python解析HTML?

用一些簡單的腳本,可以很容易地清理文檔和其它大量的 HTML 文件。但是首先你需要解析它們。

創(chuàng)新互聯公司2013年開創(chuàng)至今,先為牧野等服務建站,牧野等地企業(yè),進行企業(yè)商務咨詢服務。為牧野企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

作為 Scribus 文檔團隊的長期成員,我要隨時了解***的源代碼更新,以便對文檔進行更新和補充。 我最近在剛升級到 Fedora 27 系統(tǒng)的計算機上使用 Subversion 進行檢出操作時,對于下載該文檔所需要的時間我感到很驚訝,文檔由 HTML 頁面和相關圖像組成。 我恐怕該項目的文檔看起來比項目本身大得多,并且懷疑其中的一些內容是“僵尸”文檔——不再使用的 HTML 文件以及 HTML 中無法訪問到的圖像。

我決定為自己創(chuàng)建一個項目來解決這個問題。 一種方法是搜索未使用的現有圖像文件。 如果我可以掃描所有 HTML 文件中的圖像引用,然后將該列表與實際圖像文件進行比較,那么我可能會看到不匹配的文件。

這是一個典型的圖像標簽:

 
 
 
 
  1. Edit examples

我對 src= 之后的***組引號之間的部分很感興趣。 在尋找了一些解決方案后,我找到一個名為 BeautifulSoup 的 Python 模塊。 腳本的核心部分如下所示:

 
 
 
 
  1. soup = BeautifulSoup(all_text, 'html.parser')
  2. match = soup.findAll("img")
  3. if len(match) > 0:
  4. for m in match:
  5. imagelist.append(str(m))

我們可以使用這個 findAll 方法來挖出圖片標簽。 這是一小部分輸出:

 
 
 
 
  1. GSview - Advanced Options PanelScribus External Tools Preferences

到現在為止還挺好。我原以為下一步就可以搞定了,但是當我在腳本中嘗試了一些字符串方法時,它返回了有關標記的錯誤而不是字符串的錯誤。 我將輸出保存到一個文件中,并在 KWrite 中進行編輯。 KWrite 的一個好處是你可以使用正則表達式(regex)來做“查找和替換”操作,所以我可以用 \n 替換 ,這樣可以看得更清楚。 KWrite 的另一個好處是,如果你用正則表達式做了一個不明智的選擇,你還可以撤消。

但我認為,肯定有比這更好的東西,所以我轉而使用正則表達式,或者更具體地說 Python 的 re 模塊。 這個新腳本的相關部分如下所示:

 
 
 
 
  1. match = re.findall(r'src="(.*)/>', all_text)
  2. if len(match)>0:
  3. for m in match:
  4. imagelist.append(m)

它的一小部分輸出如下所示:

 
 
 
 
  1. images/cmcanvas.png" title="Context Menu for the document canvas" alt="Context Menu for the document canvas" />

乍一看,它看起來與上面的輸出類似,并且附帶有去除圖像的標簽部分的好處,但是有令人費解的是還夾雜著表格標簽和其他內容。 我認為這涉及到這個正則表達式 src="(.*)/>,這被稱為貪婪,意味著它不一定停止在遇到 /> 的***個實例。我應該補充一點,我也嘗試過 src="(.*)",這真的沒有什么更好的效果,我不是一個正則表達式專家(只是做了這個),找了各種方法來改進這一點但是并沒什么用。

做了一系列的事情之后,甚至嘗試了 Perl 的 HTML::Parser 模塊,最終我試圖將這與我為 Scribus 編寫的一些腳本進行比較,這些腳本逐個字符的分析文本內容,然后采取一些行動。 為了最終目的,我終于想出了所有這些方法,并且完全不需要正則表達式或 HTML 解析器。 讓我們回到展示的那個 img 標簽的例子。

 
 
 
 
  1. Edit examples

我決定回到 src= 這一塊。 一種方法是等待 s 出現,然后看下一個字符是否是 r,下一個是 c,下一個是否 =。 如果是這樣,那就匹配上了! 那么兩個雙引號之間的內容就是我所需要的。 這種方法的問題在于需要連續(xù)識別上面這樣的結構。 一種查看代表一行 HTML 文本的字符串的方法是:

 
 
 
 
  1. for c in all_text:

但是這個邏輯太亂了,以至于不能持續(xù)匹配到前面的 c,還有之前的字符,更之前的字符,更更之前的字符。

***,我決定專注于 = 并使用索引方法,以便我可以輕松地引用字符串中的任何先前或將來的字符。 這里是搜索部分:

 
 
 
 
  1. index = 3
  2. while index < linelength:
  3. if (all_text[index] == '='):
  4. if (all_text[index-3] == 's') and (all_text[index-2] == 'r') and (all_text[index-1] == 'c'):
  5. imagefound(all_text, imagelist, index)
  6. index += 1
  7. else:
  8. index += 1
  9. else:
  10. index += 1

我用第四個字符開始搜索(索引從 0 開始),所以我在下面沒有出現索引錯誤,并且實際上,在每一行的第四個字符之前不會有等號。 ***個測試是看字符串中是否出現了 =,如果沒有,我們就會前進。 如果我們確實看到一個等號,那么我們會看前三個字符是否是 s、rc。 如果全都匹配了,就調用函數 imagefound

 
 
 
 
  1. def imagefound(all_text, imagelist, index):
  2. end = 0
  3. index += 2
  4. newimage = ''
  5. while end == 0:
  6. if (all_text[index] != '"'):
  7. newimage = newimage + all_text[index]
  8. index += 1
  9. else:
  10. newimage = newimage + '\n'
  11. imagelist.append(newimage)
  12. end = 1
  13. return

我們給函數發(fā)送當前索引,它代表著 =。 我們知道下一個字符將會是 ",所以我們跳過兩個字符,并開始向名為 newimage 的控制字符串添加字符,直到我們發(fā)現下一個 ",此時我們完成了一次匹配。 我們將字符串加一個換行符(\n)添加到列表 imagelist 中并返回(return),請記住,在剩余的這個 HTML 字符串中可能會有更多圖片標簽,所以我們馬上回到搜索循環(huán)中。

以下是我們的輸出現在的樣子:

 
 
 
 
  1. images/text-frame-link.png
  2. images/text-frame-unlink.png
  3. images/gimpoptions1.png
  4. images/gimpoptions3.png
  5. images/gimpoptions2.png
  6. images/fontpref3.png
  7. images/font-subst.png
  8. images/fontpref2.png
  9. images/fontpref1.png
  10. images/dtp-studio.png

啊,干凈多了,而這只花費幾秒鐘的時間。 我本可以將索引前移 7 步來剪切 images/ 部分,但我更愿意把這個部分保存下來,以確保我沒有剪切掉圖像文件名的***個字母,這很容易用 KWrite 編輯成功 —— 你甚至不需要正則表達式。 做完這些并保存文件后,下一步就是運行我編寫的另一個腳本 sortlist.py

 
 
 
 
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # sortlist.py
  4.  
  5. import os
  6.  
  7. imagelist = []
  8. for line in open('/tmp/imagelist_parse4.txt').xreadlines():
  9. imagelist.append(line)
  10.  
  11. imagelist.sort()
  12.  
  13. outfile = open('/tmp/imagelist_parse4_sorted.txt', 'w')
  14. outfile.writelines(imagelist)
  15. outfile.close()

這會讀取文件內容,并存儲為列表,對其排序,然后另存為另一個文件。 之后,我可以做到以下幾點:

 
 
 
 
  1. ls /home/gregp/development/Scribus15x/doc/en/images/*.png > '/tmp/actual_images.txt'

然后我需要在該文件上運行 sortlist.py,因為 ls 方法的排序與 Python 不同。 我原本可以在這些文件上運行比較腳本,但我更愿意以可視方式進行操作。 ***,我成功找到了 42 個圖像,這些圖像沒有來自文檔的 HTML 引用。

這是我的完整解析腳本:

 
 
 
 
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # parseimg4.py
  4.  
  5. import os
  6.  
  7. def imagefound(all_text, imagelist, index):
  8. end = 0
  9. index += 2
  10. newimage = ''
  11. while end == 0:
  12. if (all_text[index] != '"'):
  13. newimage = newimage + all_text[index]
  14. index += 1
  15. else:
  16. newimage = newimage + '\n'
  17. imagelist.append(newimage)
  18. end = 1
  19. return
  20.  
  21. htmlnames = []
  22. imagelist = []
  23. tempstring = ''
  24. filenames = os.listdir('/home/gregp/development/Scribus15x/doc/en/')
  25. for name in filenames:
  26. if name.endswith('.html'):
  27. htmlnames.append(name)
  28. #print htmlnames
  29. for htmlfile in htmlnames:
  30. all_text = open('/home/gregp/development/Scribus15x/doc/en/' + htmlfile).read()
  31. linelength = len(all_text)
  32. index = 3
  33. while index < linelength:
  34. if (all_text[index] == '='):
  35. if (all_text[index-3] == 's') and (all_text[index-2] == 'r') and
  36. (all_text[index-1] == 'c'):
  37. imagefound(all_text, imagelist, index)
  38. index += 1
  39. else:
  40. index += 1
  41. else:
  42. index += 1
  43.  
  44. outfile = open('/tmp/imagelist_parse4.txt', 'w')
  45. outfile.writelines(imagelist)
  46. outfile.close()
  47. imageno = len(imagelist)
  48. print str(imageno) + " images were found and saved"

腳本名稱為 parseimg4.py,這并不能真實反映我陸續(xù)編寫的腳本數量(包括微調的和大改的以及丟棄并重新開始寫的)。 請注意,我已經對這些目錄和文件名進行了硬編碼,但是很容易變得通用化,讓用戶輸入這些信息。 同樣,因為它們是工作腳本,所以我將輸出發(fā)送到 /tmp 目錄,所以一旦重新啟動系統(tǒng),它們就會消失。

這不是故事的結尾,因為下一個問題是:僵尸 HTML 文件怎么辦? 任何未使用的文件都可能會引用圖像,不能被前面的方法所找出。 我們有一個 menu.xml 文件作為聯機手冊的目錄,但我還需要考慮 TOC(LCTT 譯注:TOC 是 table of contents 的縮寫)中列出的某些文件可能引用了不在 TOC 中的文件,是的,我確實找到了一些這樣的文件。

***我可以說,這是一個比圖像搜索更簡單的任務,而且開發(fā)的過程對我有很大的幫助。


當前標題:如何用Python解析HTML?
URL標題:http://www.5511xx.com/article/cdccjce.html