2015-06-27 141 views
0

問題如下: 從對象數據庫轉儲了一些基本的HTML自動生成文件。這是基於表格的信息。文件的結構對於每一代都是一樣的,通常是一致的內容。 我必須進一步處理這個文件,做一些評論等,因此我希望編輯一下這個HTML文件,讓我們說添加額外的表格單元格與可寫文本字段添加文件中的備註,也許最後一個按鈕來生成一些額外的輸出。現在的問題:使用Python解析和編輯HTML文件

我選擇編寫Python腳本來處理文件中的這種變化。這是一個正確的選擇,還是你可以提出更好的建議?

現在我處理的是如下:

1)製作的基本文件workcopy

2)打開workcopy如在Python I/O的字符串:

content = content_file.read() 

3 )通過html.parser對象運行:

ModifyHtmlParser.feed(content) 

4)使用HTM的重載基類方法大號解析器我在尋找的標籤有趣的部分:

def handle_starttag(self, tag, attrs): 
    #print("Encountered a start tag:", tag) 
    if tag == "tr": 
     print("Table row start!") 
     offset = self.getpos() 
     tagText = self.get_starttag_text() 

結果我越來越投入,標誌標籤的不可變的子集,現在我感覺像我在死衚衕也得走。 ..關於如何重新工作我的想法的任何想法?這種特殊的library可能有用嗎?

回答

1

我建議你使用下面的一般方法。

  1. 使用這些任務的任何現有庫加載和解析HTML到便捷的內存樹中。
  2. 查找樹中的相關節點。 (第1部分的大多數庫都會提供某種形式的XPath和/或CSS選擇器,它們都可以讓你找到所有滿足特定規則的節點,在你的情況下,規則可能是「tr哪個......」。)
  3. 單獨處理找到的節點(第1部分中的大多數庫都會讓您就地編輯樹)。
  4. 寫出修改後的樹或新生成的樹。

下面是如何實現上述的一個特定示例。 (庫的確切選擇有些靈活,這裏有多種選擇。)

  1. HTML解析和表示庫有多種選擇。我最近聽到的最常見的建議是LXML
  2. LXML提供了CSS selector supportXPath support
  3. 請參閱LXML etree documentation
+0

嘿,謝謝你的幫助。所以一般情況下,正如我所看到的,沒有使用額外的庫,Python中沒有現成的解決方案? – Tomas

+0

在我看來,像LXML(或美麗的湯,或任何其他替代品,真的)等第三方庫的好處超過了增加的依賴關係的成本。您只需使用標準庫HTTP庫和HTML解析器就可以做到這一點,但最終的結果將會不易維護。 – Ming