tutorial soup scraping from examples compile beautiful python html tags beautifulsoup

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