Должен ли я реализовать смешанное использование BeautifulSoup и REGEX или полагаться исключительно на BS - PullRequest
0 голосов
/ 19 мая 2009

У меня есть некоторые данные, которые мне нужно извлечь из коллекции HTML-файлов. Я не уверен, находятся ли данные в элементе div, элементе таблицы или комбинированном элементе (где тег div является элементом таблицы. Я видел все три случая. Мои файлы имеют размер - 2 МБ и У меня их десятки тысяч. До сих пор я смотрел на элементы td в таблицах и смотрел на одинокие элементы div. Мне кажется, что самое длинное время - это файл souped , до 30 секунд. Я поиграл с созданием регулярного выражения, чтобы найти данные, которые я ищу, и затем поиска следующей закрытой таблицы тегов, tr, td или div, чтобы определить, в какой структуре содержится мой текст. найти соответствующий открытый тег, вырезать этот раздел и затем обернуть его в открытые и закрытые HTML-теги

 stuff

 <div>
 stuff
 mytext
 stuff
 </div>

поэтому я создаю строку, которая выглядит следующим образом:

s='<div>stuffmyTextstuff</div>'

Я тогда заверну строку

 def stringWrapper(s):
     newString='<HTML>'+s+'</HTML>'
     return newString

А затем используйте BeautifulSoup

littleSoup=BeautifulSoup(newString)

Затем я могу получить доступ к возможностям BeautifulSoup, чтобы делать то, что я хочу с newString.

Это работает намного быстрее, чем альтернатива, которая сначала проверяет все содержимое ячеек всех таблиц, пока я не найду свой текст и, если не смогу найти его, протестирую все содержимое div.

Я что-то здесь упускаю?

Ответы [ 4 ]

3 голосов
/ 19 мая 2009

BeautifulSoup использует регулярные выражения внутри себя (именно это отличает его от других анализаторов XML), поэтому вы, скорее всего, просто повторяете то, что он делает. Если вам нужен более быстрый вариант, используйте try / catch, чтобы сначала выполнить анализ lxml или etree, а затем попытайтесь выполнить BeautifulSoup и / или tidylib для анализа неработающего HTML в случае сбоя анализатора.

Кажется, что для того, что вы делаете, вы действительно хотите использовать XPath или XSLT для поиска и извлечения ваших данных, lxml может делать и то, и другое.

Наконец, учитывая размер ваших файлов, вам, вероятно, следует проанализировать, используя путь или дескриптор файла, чтобы источник мог считываться постепенно, а не храниться в памяти для анализа.

3 голосов
/ 19 мая 2009

Вы пробовали lxml? BeautifulSoup хорош, но не супербыстрый, и я считаю, что lxml может предложить то же качество, но часто более высокую производительность.

1 голос
/ 19 мая 2009

Я обнаружил, что даже если lxml быстрее, чем BeautifulSoup, для документов такого размера обычно лучше попытаться уменьшить размер до нескольких килобайт с помощью регулярного выражения (или прямого извлечения) и загрузить его в BS, как вы делаете Теперь.

1 голос
/ 19 мая 2009

Я не совсем понимаю, что вы пытаетесь сделать. Но я знаю, что вам не нужно заключать вашу строку div в теги . БС разберется с этим просто отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...