Очистка экрана Python lxml?

Мне нужно сделать некоторый разбор HTML с помощью python. После некоторых исследований lxml кажется моим лучшим выбором, но мне трудно найти примеры, которые помогут мне в том, что я пытаюсь сделать. вот почему я слышу. Мне нужно очистить страницу от всего видимого текста.. удалить все теги и javascript.. Мне нужно, чтобы он оставил мне текст, который можно просмотреть. звучит достаточно просто .. я сделал это с помощью HTMLParser, но он плохо обрабатывает javascript

class HTML2Text(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.output = cStringIO.StringIO()

    def get_text(self):
        return self.output.getvalue()

    def handle_data(self, data):
        self.output.write(data)

def ParseHTML(source):
    p = HTML2Text()
    p.feed(source)
    text = p.get_text()
    return text

Любые идеи для способа сделать это с помощью lxml или лучший способ сделать это HTMLParser.. HTMLParser будет лучше, потому что дополнительные библиотеки не нужны.. спасибо всем

Скотт Ф.


person Community    schedule 02.05.2009    source источник


Ответы (5)


Я не знаю ни одной библиотеки очистки экрана, которая "хорошо работает с Javascript" - слишком сложно предвидеть все способы, которыми JS может динамически, условно и т. д. изменять HTML DOM.

person Alex Martelli    schedule 02.05.2009

scrape.py может сделать это за вас.

Это так же просто, как:

import scrape
s = scrape.Session()
s.go('yoursite.com')
print s.doc.text

Перейдите примерно на 2:40 в этом видео, чтобы посмотреть потрясающий обзор от создателя scrape.py: pycon.blip .tv/файл/3261277

person PPC-Coder    schedule 08.04.2010

BeautifulSoup (http://www.crummy.com/software/BeautifulSoup/) часто правильный ответ на вопросы о парсинге html в python.

person Community    schedule 02.05.2009

Я не знаю ни одной библиотеки синтаксического анализа HTML Python, которая обрабатывает запуск javascript на анализируемой странице. Это не «достаточно просто» по причинам, указанным Алексом Мартелли и другими.

Для этой задачи вам, возможно, придется подумать о переходе на более высокий уровень, чем просто синтаксический анализ HTML, и взглянуть на фреймворки для тестирования веб-приложений.

Два, которые могут выполнять javascript и либо основаны на Python, либо могут взаимодействовать с Python:

К сожалению, я не уверен, что ориентация этих фреймворков на «модульное тестирование» действительно позволит вам очистить видимый текст.

Таким образом, единственным другим решением было бы сделать это самостоятельно, скажем, интегрировав python-spidermonkey в ваше приложение.

person Van Gale    schedule 02.05.2009

Ваш код умен и очень гибок, я думаю.

Как насчет того, чтобы просто добавить handle_starttag() и handle_endtag(), чтобы подавить блоки ‹script›?

class HTML2Text(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.output = cStringIO.StringIO()
        self.is_in_script = False
    def get_text(self):
        return self.output.getvalue()
    def handle_data(self, data):
        if not self.is_in_script:
            self.output.write(data)
    def handle_starttag(self, tag, attrs):
        if tag == "script":
            self.is_in_script = True
    def handle_endtag(self, tag):
        if tag == "script":
            self.is_in_script = False

def ParseHTML(source):
    p = HTML2Text()
    p.feed(source)
    text = p.get_text()
    return text
person Community    schedule 05.09.2009