Как найти тег комментария ‹!----› с BeautifulSoup?

Я попробовал суп.найти('!--') но, похоже, это не работает. Заранее спасибо.

Редактировать: Спасибо за совет о том, как найти все комментарии. У меня вопрос вдогонку. Как конкретно найти комментарий?

Например, у меня есть следующий тег комментария:

<!-- <span class="titlefont"> <i>Wednesday 110518</i>(05:00PM)<br /></span> -->

Я действительно просто хочу эту штуку <i>Wednesday 110518</i>. «110518» — это дата ГГММДД, которую я использую в качестве цели поиска. Однако я не знаю, как найти что-то в определенном теге комментария.


person 1stsage    schedule 19.05.2011    source источник


Ответы (2)


Pyparsing позволяет вам искать комментарии HTML с помощью встроенного выражения htmlComment и присоединять обратные вызовы во время анализа для проверки и извлечения различных полей данных в комментарии:

from pyparsing import makeHTMLTags, oneOf, withAttribute, Word, nums, Group, htmlComment
import calendar

# have pyparsing define tag start/end expressions for the 
# tags we want to look for inside the comments
span,spanEnd = makeHTMLTags("span")
i,iEnd = makeHTMLTags("i")

# only want spans with class=titlefont
span.addParseAction(withAttribute(**{'class':'titlefont'}))

# define what specifically we are looking for in this comment
weekdayname = oneOf(list(calendar.day_name))
integer = Word(nums)
dateExpr = Group(weekdayname("day") + integer("daynum"))
commentBody = '<!--' + span + i + dateExpr("date") + iEnd

# define a parse action to attach to the standard htmlComment expression,
# to extract only what we want (or raise a ParseException in case 
# this is not one of the comments we're looking for)
def grabCommentContents(tokens):
    return commentBody.parseString(tokens[0])
htmlComment.addParseAction(grabCommentContents)


# let's try it
htmlsource = """
want to match this one
<!-- <span class="titlefont"> <i>Wednesday 110518</i>(05:00PM)<br /></span> -->

don't want the next one, wrong span class
<!-- <span class="bodyfont"> <i>Wednesday 110519</i>(05:00PM)<br /></span> -->

not even a span tag!
<!-- some other text with a date in italics <i>Wednesday 110520</i>(05:00PM)<br /></span> -->

another matching comment, on a different day
<!-- <span class="titlefont"> <i>Thursday 110521</i>(05:00PM)<br /></span> -->
"""

for comment in htmlComment.searchString(htmlsource):
    parsedDate = comment.date
    # date info can be accessed like elements in a list
    print parsedDate[0], parsedDate[1]
    # because we named the expressions within the dateExpr Group
    # we can also get at them by name (this is much more robust, and 
    # easier to maintain/update later)
    print parsedDate.day
    print parsedDate.daynum
    print

Отпечатки:

Wednesday 110518
Wednesday
110518

Thursday 110521
Thursday
110521
person PaulMcG    schedule 19.05.2011
comment
Последняя версия pyparsing теперь включает withClass для упрощения этого withAttribute уродства. - person PaulMcG; 20.04.2016

Вы можете найти все комментарии в документе с помощью метода findAll. Посмотрите этот пример, показывающий, как сделать именно то, что вы пытаетесь сделать Удаление элементов :

Вкратце, вы хотите это:

comments = soup.findAll(text=lambda text:isinstance(text, Comment))

Изменить: если вы пытаетесь выполнить поиск в столбцах, вы можете попробовать:

import re
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
for comment in comments:
  e = re.match(r'<i>([^<]*)</i>', comment.string).group(1)
  print e
person yan    schedule 19.05.2011
comment
Как насчет поиска конкретного комментария? Я пытаюсь найти это в файле html: ‹!-- ‹span class=titlefont› ‹i›Среда 110518‹/i›(17:00)‹br /›‹/span› --› Обратите внимание на 110518, это просто дата в формате ггммдд, как я могу искать информацию только в этом теге комментария и, в частности, только в пределах ‹i›‹/i›? - person 1stsage; 19.05.2011
comment
@1stsage Возможно, вы хотите добавить это требование к своему вопросу. - person Steven Rumbalski; 19.05.2011
comment
1stsage, обновил свой пост для вашего конкретного случая. В следующий раз убедитесь, что ваш вопрос охватывает то, что вы пытаетесь сделать. - person yan; 19.05.2011
comment
@1stsage Что касается поиска по содержимому комментария, если он правильный html, вы также можете его проанализировать. Или вы можете использовать строковые методы или даже регулярные выражения. С таким небольшим текстом и простым требованием я бы согласился на регулярное выражение (что-то вроде r'\<i\>(.*?)\</i\>'). - person Steven Rumbalski; 19.05.2011