Извлечь строки в python

По сути, я хочу извлечь строки «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("файл.txt")

Я получил:-

данные = ['AAA','BBB','CCC','DDD']

Каков наилучший способ? Мой файл не большой...

По сути, я хочу извлечь «оставшуюся передачу данных загрузки» из этот файл который в HTML выглядит как ЭТО


person Abhijeet Rastogi    schedule 17.03.2010    source источник


Ответы (5)


Вы можете написать REGEX, но это будет в некоторой степени «анализировать» HTML. Проблема с написанием регулярных выражений для HTML заключается в том, что HTML — это беспорядок. Он редко бывает идеальным, и это вызывает проблемы, когда вы полагаетесь на него для получения данных.

Лично я бы использовал BeautifulSoup. Он делает больше, чем вы просите, но при этом требует гораздо меньше усилий.

person Oli    schedule 17.03.2010

Вы хотите BeautifulSoup:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(your_file)

soup.find("font", "textfont")
person Dominic Rodger    schedule 17.03.2010
comment
Я хочу сделать это без использования сторонней библиотеки. Bcos, мне действительно не нужна обработка html. Моя цель - просто извлечь эти строки. - person Abhijeet Rastogi; 17.03.2010
comment
@shadyabhi, не использовать библиотеку - глупая цель. Синтаксический анализатор HTML — это правильный инструмент для того, что вы пытаетесь сделать (разбор HTML), и он позволяет написать простую и лаконичную функцию. - person Mike Graham; 17.03.2010
comment
@Dominic, lxml, вероятно, лучший выбор в наши дни, поскольку он все еще активно развивается. - person Mike Graham; 17.03.2010

В таком случае попробуйте использовать для него регулярное выражение (которое действительно будет иметь место), используйте предварительно написанную библиотеку или сделайте это самостоятельно с помощью f = open() f.read() и собственного парсера.

person zellio    schedule 17.03.2010

Если вы просто хотите получить данные из всех тегов в 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. См. здесь.

person Matt Anderson    schedule 17.03.2010

person    schedule
comment
Я думаю, что порядок не будет отображаться, если в одной строке присутствует более одного элемента... - person fortran; 17.03.2010
comment
Я не знаю, что вы имеете в виду под заказом. Я не вижу такой спецификации в вопросе. И мой алгоритм найдет все строки в look_for, которые есть в html, даже если они находятся в одной строке. - person inspectorG4dget; 19.03.2010