Красивый суп занимает слишком много времени для извлечения текста в обычных данных сканирования
Я должен анализировать содержимое HTML в общем наборе данных сканирования (файлы warc.gz). Я решил использовать bs4
(Beautifulsoup) модуль, как это обычно предлагают люди. Ниже приведен фрагмент кода для получения текста:
from bs4 import BeautifulSoup
soup = BeautifulSoup(src, "lxml")
[x.extract() for x in soup.findAll(['script', 'style'])]
txt = soup.get_text().encode('utf8')
без bs4
один файл полностью обработан за 9 минут (контрольный пример), но если я использую bs4
для разбора текста, то работа завершена примерно через 4 часа. Что это происходит Есть ли лучшее решение, кроме bs4
? Примечание: bs4 - это класс, который содержит много модулей, таких как Beautifilsoup.
1 ответ
Решение
Здесь основной трудоемкой частью является извлечение тегов при сжатии списка. С lxml
и регулярное выражение Python вы можете сделать это следующим образом.
import re
script_pat = re.compile(r'<script.*?<\/script>')
# to find all scripts tags
script_pat.findall(src)
# do your stuff
print re.sub(script_pat, '', src)
С помощью lxml
Вы можете сделать это так:
from lxml import html, tostring
et = html.fromstring(src)
# remove the tags
[x.drop_tag() for x in et.xpath('//script')]
# do your stuff
print tostring(et)