Python lxml скребет экран? - PullRequest
1 голос
/ 02 мая 2009

Мне нужно сделать разбор 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 будет лучше, потому что никаких дополнительных библиотек не требуется .. спасибо всем

Скотт Ф.

Ответы [ 5 ]

4 голосов
/ 02 мая 2009

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

2 голосов
/ 09 апреля 2010

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

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

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

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

0 голосов
/ 05 сентября 2009

Ваш код, на мой взгляд, умный и очень гибкий.

Как насчет простого добавления handle_starttag () и handle_endtag () для подавления блоков ?

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
0 голосов
/ 02 мая 2009

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

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

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

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

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

0 голосов
/ 02 мая 2009

BeautifulSoup (http://www.crummy.com/software/BeautifulSoup/) часто является правильным ответом на вопросы по поиску в Python html.

...