代码之家  ›  专栏  ›  技术社区  ›  Andrea Ambu

漂亮的汤-获取HTML免费内容的简单方法

  •  7
  • Andrea Ambu  · 技术社区  · 16 年前

    我使用此代码在一个页面中查找所有有趣的链接:

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

    它的工作做得很好。不幸的是,在那里面 标签有很多嵌套的标签,比如 字体 , 不同的事情…我只想得到文本内容,没有任何其他HTML标记。

    链接示例:

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

    当然很难看(而且标记也不总是一样的!)我想知道:

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

    在文档中它说要使用 text=True 在findall方法中,但它将忽略我的regex。为什么?我怎么解决这个问题?

    2 回复  |  直到 16 年前
        1
  •  12
  •   Jonathan Feinberg    16 年前

    我用过这个:

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

    所以…

    texts = [textOf(n) for n in soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+'))]
    
        2
  •  2
  •   PaulMcG    16 年前

    对Pyparsing的问题感兴趣?

    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)
    

    印刷品:

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

    这实际上对HTML的变幻莫测是不受影响的,因为它会影响属性的存在/不存在、大小写等等。

    推荐文章