LINUX.ORG.RU

Исключить блок html с помощью xpath или regex в python

 , , ,


1

1

Привет, ЛОР!

Столкнулся с такой задачей: нужно с помощью python2 взять исходник html-страницы, далее удалить из неё определенные xpath'ы (к примеру, выпиливать блоки с рекламой, т.к. они не несут в себе никакой полезной информации), и вернуть модифицированный html-код.

Сейчас делаю так:

    @staticmethod
    def remove_unnecessary_tags(url, html_source):
        try:
            name = re.findall('.*?/?\.?(\w+)\.\w{2,4}/', url)[0]
        except KeyError:
            print 'Cannot find what the name in %s' % url
            return html_source
        original = html.fromstring(html_source)
        try:
            return original.xpath('.//*[not(%s)]' % x.get_xpaths(name))
        except Exception as e:
            print e
            return original

Проблем а в том, что возвращаю я уже не html-код, а список из

<Element div at 0xb58fad9c>
<Element script at 0xb58fadc4>
<Element script at 0xb58fadec>
<Element noscript at 0xb58fae14>
<Element div at 0xb58fae3c>
<Element img at 0xb58fae64>

У них есть методы elem.tag и elem.text, но ни один из них не позволяет получить полноценную строку типа <div class=«bla»>blabla</div>, как было изначально.

Конечно, остается еще вариант выпиливания кусков по regexp, но я не уверен что это хорошая идея.

Что посоветуешь, ЛОР?

★★

lxml.etree:

from lxml import etree, html

parser = html.HTMLParser(encoding='iso-8859-1')
with open(filename) as fi:
    tree = etree.parse(fi, parser)

for e in tree.xpath('//something'):
    e.getparent().remove(e)

print etree.tostring(tree, encoding='utf-8')
anonymous
()
Ответ на: комментарий от anonymous

anonymous, спасибо огромное! Именно то, что нужно. А я гуглил не те фразы, раз этого не нашел.

kir64 ★★
() автор топика
Ответ на: комментарий от sT331h0rs3

Спасибо, ознакомился. Но благодаря анонимусу удалось обойтись стандартной библиотекой.

kir64 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.