python - scraping - select beautifulsoup
¿Cómo encontrar la etiqueta de comentario<!-…-> con BeautifulSoup? (2)
Probé soup.find (''! -'') pero no parece funcionar. Gracias por adelantado.
Edit: Gracias por el consejo sobre cómo encontrar todos los comentarios. Tengo una pregunta de seguimiento. ¿Cómo busco específicamente un comentario?
Por ejemplo, tengo la siguiente etiqueta de comentario:
<!-- <span class="titlefont"> <i>Wednesday 110518</i>(05:00PM)<br /></span> -->
Realmente solo quiero esto <i>Wednesday 110518</i>
. El "110518" es la fecha YYMMDD en la que me inclino a usar como objetivo de búsqueda. Sin embargo, no sé cómo encontrar algo dentro de una etiqueta de comentario específica.
Puede encontrar todos los comentarios en un documento a través del método findAll
. Vea este ejemplo que muestra cómo hacer exactamente lo que está intentando hacer. Eliminando elementos :
En resumen, quieres esto:
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
Editar: Si está intentando buscar dentro de las columnas, puede intentar:
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
Pyparsing le permite buscar comentarios HTML usando una expresión htmlComment
incorporada, y adjuntar devoluciones de tiempo de llamada para validar y extraer los diversos campos de datos dentro del comentario:
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
Huellas dactilares:
Wednesday 110518
Wednesday
110518
Thursday 110521
Thursday
110521