2010-03-17 114 views
0

基本上,我想提取字符串「AAA」,「BBB」,「CCC」,從文本文件「DDD」 ..提取字符串

...... (other text goes here)..... 
<TD align="left" class=texttd><font class='textfont'>AAA</font></TD> 
..... (useless text here)..... 
<TD align="left" class=texttd><font class='textfont'>BBB</font></TD> 
....(more text)..... 
<TD align="left" class=texttd><font class='textfont'>CCC</font></TD> 
<TD align="left" class=texttd><font class='textfont'>DDD</font></TD> 
......(more text)..... 

我想是這樣,如果我做: -

數據= FOO( 「file.txt的」)

我得到: -

data = ['AAA','BBB','CCC','DDD']

什麼是最好的方法?我的文件並不大..

基本上,我想從this file這在HTML像THIS

回答

2

你可以寫一個REGEX,但它會在某種程度上「解析」HTML。爲HTML編寫正則表達式的問題是HTML是一團糟。它很少完美,當您依賴數據時會導致問題。

我會親自使用BeautifulSoup。它的確做得比你所要求的要多,但也要做到這一點。

0

你想BeautifulSoup看起來提取「剩餘上傳數據傳輸」:

from BeautifulSoup import BeautifulSoup 
soup = BeautifulSoup(your_file) 

soup.find("font", "textfont") 
+0

我想這樣做,而不使用第三方庫.. Bcos,我真的不想要HTML處理..我的目標只是提取這些字符串.. – 2010-03-17 17:42:42

+1

@shadyabhi,不使用庫是一個愚蠢的目標。 HTML解析器是正在嘗試執行的任務(解析HTML)的正確工具,並提供了一種編寫簡單而簡潔的函數的方法。 – 2010-03-17 17:46:27

+0

@Dominic,lxml現在可能是一個更好的選擇,因爲它仍然在積極開發之中。 – 2010-03-17 17:46:51

0
def foo(): 
    input_file = open("myfile.txt", 'r') 
    input = ''.join(input_file.readlines()) 

    looking_for = ['AAA', 'BBB', 'CCC', 'DDD'] 
    have = [] 

    for thing in looking_for: 
     if thing in input: 
      have.append(thing) 
    return have 
+0

我認爲如果不止一個項目出現在同一行中,將不會呈現排序... – fortran 2010-03-17 17:59:00

+0

我不知道「訂購」意味着什麼。我在這個問題上沒有看到這樣的說明。而且我的算法會查找html中的所有字符串,即使它們在同一行中。 – inspectorG4dget 2010-03-19 01:28:56

0

在的情況下,像這樣它的,因爲它嘗試正則表達式(這將真的有),使用預先寫好的圖書館,或做你的自我與f = open() f.read()和自己的解析器。

0

如果你只是想從裏面所有的HTML文檔中的標籤獲得的數據,同時刪除所有的標籤本身,你可以做這樣的事情:

import HTMLParser 

class DataOnlyParser(HTMLParser.HTMLParser): 
    def parse(self, text): 
     self.result = [] 
     self.feed(text) 
     self.close() 
     return self.result 

    def handle_data(self, data): 
     data = data.strip() 
     if data: 
      self.result.append(data) 

p = DataOnlyParser() 

data = """ 
<TD align="left" class=texttd><font class='textfont'>AAA</font></TD> 
<TD align="left" class=texttd><font class='textfont'>BBB</font></TD> 
<TD align="left" class=texttd><font class='textfont'>CCC</font></TD> 
<TD align="left" class=texttd><font class='textfont'>DDD</font></TD> 
""" 

print p.parse(data) 
# ['AAA', 'BBB', 'CCC', 'DDD'] 

如果你的選擇標準是更雖然複雜,並且/或者如果輸入格式不正確,那麼使用lxml等庫可能會更好。

你不想使用正則表達式來「解析」html。見here