2010-03-17 80 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