Хобрук: Ваш путь к мастерству в программировании

Использование BeautifulSoup для поиска HTML-тега, содержащего определенный текст

Я пытаюсь получить элементы в HTML-документе, содержащие следующий образец текста: # \ S {11}

<h2> this is cool #12345678901 </h2>

Итак, предыдущее будет соответствовать, используя:

soup('h2',text=re.compile(r' #\S{11}'))

И результаты будут примерно такими:

[u'blahblah #223409823523', u'thisisinteresting #293845023984']

Я могу получить весь соответствующий текст (см. Строку выше). Но я хочу, чтобы родительский элемент текста совпадал, поэтому я могу использовать его в качестве отправной точки для обхода дерева документа. В этом случае я бы хотел, чтобы возвращались все элементы h2, а не совпадение текста.

Идеи?


  • На самом деле ограничение h2 игнорируется согласно документации BeautifulSoup: если вы используете текст, то любые значения, которые вы даете для name и аргументов ключевого слова, игнорируются. 25.06.2010
  • @Rabarberski Не знаю, какая была ситуация в 2010 году, но к 2012 году обнаруживает, что использование text (или string, который его заменил) не будет игнорировать любые другие ограничения. 20.01.2018

Ответы:


1
from BeautifulSoup import BeautifulSoup
import re

html_text = """
<h2>this is cool #12345678901</h2>
<h2>this is nothing</h2>
<h1>foo #126666678901</h1>
<h2>this is interesting #126666678901</h2>
<h2>this is blah #124445678901</h2>
"""

soup = BeautifulSoup(html_text)


for elem in soup(text=re.compile(r' #\S{11}')):
    print elem.parent

Печать:

<h2>this is cool #12345678901</h2>
<h2>this is interesting #126666678901</h2>
<h2>this is blah #124445678901</h2>
14.05.2009
  • Спасибо! Сбивает с толку то, что он вернул то, что выглядело как список строк Юникода. Я ценю помощь. 15.05.2009
  • .parent было потрясающе! Я никогда не думал об этом. Спасибо @nosklo. +1 25.10.2014
  • Если вы хотите сразу повторить вывод результатов поиска, тогда for идеально подойдет. А как насчет понимания списка как такового: [elem.parent для элемента в soup (text = re.compile (r '# \ S {11}'))] 03.09.2016
  • @sotangochips Да, сначала кажется, что он возвращает простую строку Unicode, но на самом деле это NavigableString с .parent. Пришлось использовать отладчик PyCharm, чтобы понять, что это не простая строка. 08.05.2018

  • 2

    Операции поиска BeautifulSoup доставляют [список] BeautifulSoup.NavigableString объектов, когда text= используется в качестве критерия, в отличие от BeautifulSoup.Tag в других случаях. Проверьте __dict__ объекта, чтобы увидеть доступные вам атрибуты. Из этих атрибутов parent предпочтительнее previous из-за изменений в BS4 .

    from BeautifulSoup import BeautifulSoup
    from pprint import pprint
    import re
    
    html_text = """
    <h2>this is cool #12345678901</h2>
    <h2>this is nothing</h2>
    <h2>this is interesting #126666678901</h2>
    <h2>this is blah #124445678901</h2>
    """
    
    soup = BeautifulSoup(html_text)
    
    # Even though the OP was not looking for 'cool', it's more understandable to work with item zero.
    pattern = re.compile(r'cool')
    
    pprint(soup.find(text=pattern).__dict__)
    #>> {'next': u'\n',
    #>>  'nextSibling': None,
    #>>  'parent': <h2>this is cool #12345678901</h2>,
    #>>  'previous': <h2>this is cool #12345678901</h2>,
    #>>  'previousSibling': None}
    
    print soup.find('h2')
    #>> <h2>this is cool #12345678901</h2>
    print soup.find('h2', text=pattern)
    #>> this is cool #12345678901
    print soup.find('h2', text=pattern).parent
    #>> <h2>this is cool #12345678901</h2>
    print soup.find('h2', text=pattern) == soup.find('h2')
    #>> False
    print soup.find('h2', text=pattern) == soup.find('h2').text
    #>> True
    print soup.find('h2', text=pattern).parent == soup.find('h2')
    #>> True
    
    12.11.2012
  • Для меня soup.find('h2', text=pattern) дает тег напрямую, не нужно вызывать .parent. Также в документации говорится, что вы можете объединить string (text в предыдущих версиях) параметр с аргументами, которые находят теги. В этом случае BeautifulSoup вернет тег 15.07.2017

  • 3

    С bs4 (Beautiful Soup 4) попытка OP работает точно так, как ожидалось:

    from bs4 import BeautifulSoup
    soup = BeautifulSoup("<h2> this is cool #12345678901 </h2>")
    soup('h2',text=re.compile(r' #\S{11}'))
    

    возвращает [<h2> this is cool #12345678901 </h2>].

    20.01.2018
    Новые материалы

    Как я могу подписаться на тему изображений в ROS Matlab и получить изображение RGB?
    Привет, Пожалуйста, как я могу извлечь изображение из сообщения ROS Image, за которым следует imshow? Я уже подписался на правильную тему, но message.getData() дает мне объект..

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..