Красивый суп занимает слишком много времени для извлечения текста в обычных данных сканирования

Я должен анализировать содержимое 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)
Другие вопросы по тегам