7

Tôi đang sử dụng mã này để tìm tất cả các liên kết thú vị trong một trang:BeautifulSoup - cách dễ dàng để có được nội dung HTML miễn

soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+')) 

Và nó công việc của mình khá tốt. Thật không may bên trong đó thẻ có rất nhiều thẻ lồng nhau, như phông chữ, b và những thứ khác ... Tôi muốn nhận nội dung văn bản mà không cần bất kỳ thẻ html nào khác.

Ví dụ về liên kết:

<A HREF="notizia.php?idn=1134" OnMouseOver="verde();" OnMouseOut="blu();"><FONT CLASS="v12"><B>03-11-2009:&nbsp;&nbsp;<font color=green>CCS Ingegneria Elettronica-Sportello studenti ed orientamento</B></FONT></A> 

Tất nhiên đó là xấu xí (và đánh dấu không phải lúc nào cũng giống nhau!) Và tôi muốn để có được:

03-11-2009: CCS Ingegneria Elettronica-Sportello studenti ed orientamento 

Trong tài liệu hướng dẫn nó nói để sử dụng text=True trong phương thức findAll, nhưng nó sẽ bỏ qua regex của tôi. Tại sao? Làm thế nào tôi có thể giải quyết điều đó?

+0

PyQuery nghe giống như một lựa chọn thực sự tuyệt vời: http://pypi.python.org/pypi/pyquery –

Trả lời

12

Tôi đã sử dụng này:

def textOf(soup): 
    return u''.join(soup.findAll(text=True)) 

Vậy ...

texts = [textOf(n) for n in soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+'))] 
+0

Tôi nghĩ bạn cần một vòng lặp - bạn không thể gọi 'findAll' trên tập kết quả, chỉ trên một kết quả duy nhất . – RichieHindle

+0

Bạn đúng vậy. Đã chỉnh sửa; cảm ơn. –

+0

Nó hoạt động! Cảm ơn bạn! –

2

Quan tâm đến một pyparsing gánh vác vấn đề?

from pyparsing import makeHTMLTags, SkipTo, anyOpenTag, anyCloseTag, ParseException 

htmlsrc = """<A HREF="notizia.php?idn=1134" OnMouseOver="verde();" OnMouseOut="blu();"><FONT CLASS="v12"><B>03-11-2009:&nbsp;&nbsp;<font color=green>CCS Ingegneria Elettronica-Sportello studenti ed orientamento</B></FONT></A>""" 

# create pattern to find interesting <A> tags 
aStart,aEnd = makeHTMLTags("A") 
def matchInterestingHrefsOnly(t): 
    if not t.href.startswith("notizia.php?"): 
     raise ParseException("not interested...") 
aStart.setParseAction(matchInterestingHrefsOnly) 
patt = aStart + SkipTo(aEnd)("body") + aEnd 

# create pattern to strip HTML tags, and convert HTML entities 
stripper = anyOpenTag.suppress() | anyCloseTag.suppress() 
def stripTags(s): 
    s = stripper.transformString(s) 
    s = s.replace("&nbsp;"," ") 
    return s 


for match in patt.searchString(htmlsrc): 
    print stripTags(match.body) 

Prints:

03-11-2009: CCS Ingegneria Elettronica-Sportello studenti ed orientamento 

Đây thực sự là khá không thấm nước để thay đổi bất thường HTML, vì nó yếu tố trong sự hiện diện/vắng mặt của các thuộc tính, chữ hoa/thấp hơn, và như vậy.