Эффективный способ разбора html, когда нужно только первое появление определенного тега - PullRequest
1 голос
/ 09 июля 2019

У меня большой HTML-документ.Я анализирую его с помощью BeautifulSoup, но единственная информация, которую я хочу извлечь, - это текст определенного тега (который, я считаю, встречается только один раз).

Документ отформатирован так:

    <html>
        <div class=...>
            <div class=...
                <div class="foo">
    ...
    ...

В настоящее время я использую SoupStrainer для фильтрации только тегов div с классом "foo".Возможно, мне следует использовать другую библиотеку, или, возможно, я неправильно понимаю, что делает SoupStrainer.

    html = open("file.html", encoding="UTF8").read()
    parse_only = SoupStrainer("div", class_="foo")
    soup = BeautifulSoup(raw_html, "lxml", parse_only=parse_only)
    text = soup.text

Я надеялся, что это будет значительно быстрее, чем без SoupStrainer, но я получил ускорение всего в 2 раза, и мне бы хотелось, чтобы оно было быстрее.Я думаю, что причина этого состоит в том, что он все еще должен проверить, соответствует ли каждый отдельный тег в документе, напрягая его.Я хотел бы, чтобы он просто остановился на первом теге, который соответствует этому, и больше не занимался бы разбором документа.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Функция Beautiful Soup find должна вам помочь.

html = open("file.html", encoding="UTF8").read()
soup = BeautifulSoup(html)
print(soup.find("div", class_="foo"))

При этом будет получено только первое совпадение.

0 голосов
/ 09 июля 2019

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

Пожалуйста, посмотрите здесь для получения дополнительной информации https://lxml.de/tutorial.html#event-driven-parsing

и учебное пособие здесь: http://boscoh.com/programming/reading-xml-serially.html и здесь: https://www.ibm.com/developerworks/xml/library/x-hiperfparse/

Эти примеры для html, но вы также можете использовать lxml для анализа html.В моем случае у меня был текстовый XML-файл объемом 1,1 ГБ, и просмотр всего файла занял у меня ~ 10 м.

Быстрый пример:

inputfile = open('file.html')
context = etree.iterparse(inputfile, events=('end',), tag='YOUR_TAG_NAME')

for event, elem in context:
    if event == END and elem.tag == 'YOUR_TAG_NAME':
        print(elem.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...