2011-05-19 10 views
17

Çorbayı denedim ('! -') ama işe yaramıyor. Şimdiden teşekkürler.Yorum Yazan: <!--...--> with BeautifulSoup?

Düzenleme: Tüm yorumları nasıl bulacağınız için teşekkür ederiz. Bir takip sorumlum var. Özellikle bir yorumu nasıl arayabilirim? Gerçekten sadece bu şeyleri <i>Wednesday 110518</i> istiyorum

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

:

Örneğin, ben şu açıklama etiketi var. "110518", arama hedefim olarak kullanmaya başladığım YYMMDD tarihidir. Bununla birlikte, belirli bir yorum etiketinde bir şeyi nasıl bulacağımı bilmiyorum.

cevap

0

Pyparsing Eğer bir yerleşik htmlComment ifadesini kullanarak HTML yorumlar için arama yapmanızı sağlar ve eklemek ayrıştırmak zamanlı geri aramaları doğrulamak ve yorum içindeki çeşitli veri alanları elde: deneyin

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 

Baskılar:

Wednesday 110518 
Wednesday 
110518 

Thursday 110521 
Thursday 
110521 
+0

Püskürtme işleminin en son sürümü şimdi 'withClass' ile' withAttribute 'çirkinliğini basitleştirmek için içerir. – PaulMcG

23

Bir belgedeki tüm yorumları findAll yöntemiyle bulabilirsiniz. Eğer Removing elements yapmaya çalıştığını tam olarak ne nasıl yapılacağını gösteren bu örneğe bakın:

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

Düzenleme:: Kısaca

, bunu ister sütun içinde arama yapmak için çalışıyorsanız, yapabilirsiniz

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 
+0

nasıl Belirli bir yorumdan arama hakkında? Bunun için html dosyasında arama yapmaya çalışıyorum: Çarşamba 110518 (05:00 PM)
-> 110518'e dikkat edin, bu sadece yymmdd'deki tarih Bu yorum etiketindeki bilgiler için ve özellikle yalnızca içinde nasıl arama yapabilirim? – 1stsage

+0

@ 1stsage Belki de bu ihtiyacı sorunuza eklemek istersiniz. –

+0

1.sage, özel durumunuz için gönderimi güncelledim. Bir dahaki sefere, sorunuzun yapmaya çalıştığınız şeyi kapsadığından emin olun. – yan

İlgili konular