Более быстрый / менее разрушающий ресурсы способ убрать html из больших файлов, чем BeautifulSoup? Или лучший способ использовать BeautifulSoup? - PullRequest
6 голосов
/ 24 января 2011

В настоящее время у меня возникают проблемы при наборе текста, потому что, согласно top, мой процессор на 100%, а память на 85,7%, и все это занято Python.

Почему?Потому что мне пришлось пройти через 250-мегабайтный файл, чтобы удалить разметку.250 мег, вот и все!Я манипулировал этими файлами в python со многими другими модулями и вещами;BeautifulSoup - первый код, который дает мне проблемы с чем-то таким маленьким.Как почти 4 гигабайта оперативной памяти используются для манипулирования 250 мегабайтами html?

Однострочник, который я нашел (на stackoverflow) и использовал, был следующим:

''.join(BeautifulSoup(corpus).findAll(text=True))

Кроме того, этокажется, удаляет все, НО разметка, которая является своего рода противоположностью того, что я хочу сделать.Я уверен, что BeautifulSoup тоже может это сделать, но проблема скорости остается.

Есть ли что-нибудь, что будет делать что-то подобное (удалить разметку, оставить текст надежно ) и НЕ потребовать Cray для запуска?

Ответы [ 2 ]

14 голосов
/ 24 января 2011

lxml.html намного эффективнее.

http://lxml.de/lxmlhtml.html

enter image description here

http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/

Похоже, это будет делать то, что вы хотите.

import lxml.html
t = lxml.html.fromstring("...")
t.text_content()

Пара других похожих вопросов: python [lxml] - очистка тегов html

lxml.etree, element.text не возвращает весь текст из элемента

Отфильтровывать теги HTML и разрешать объекты в python

ОБНОВЛЕНИЕ:

Вы, вероятно, хотите очистить HTML, чтобы удалить все скрипты и CSS, а затем извлечь текст, используя .text_content()

from lxml import html
from lxml.html.clean import clean_html

tree = html.parse('http://www.example.com')
tree = clean_html(tree)

text = tree.getroot().text_content()

(From: Удалить все HTML в Python? )

0 голосов
/ 24 января 2011

используйте очиститель из lxml.html:

>>> import lxml.html
>>> from lxml.html.clean import Cleaner
>>> cleaner = Cleaner(style=True) # to delete scripts styles objects comments etc;)
>>> html = lxml.html.fromstring(content).xpath('//body')[0]
>>> print cleaner.clean_html(html)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...