2015-12-21 69 views
1

结构如HTML的标签具有开口和封闭部,共享相同的标签,以匹配他们彼此。解析复杂匹配的分隔符

<tag> ... </tag> 

我想使用pyparsing库来捕获这些对和它们的内容。我知道如何指定一个标签。

from pyparsing import SkipTo, makeHTMLTags 
open, close = makeHTMLTags("tag") 
(open + SkipTo(close) + close).parseString("<tag> Tag content </tag>") 
# yields ['tag', False, 'Tag content ', '</tag>'] 

我也知道,指定多个不同的标签时,他们每个人都需要一个专门的规则,以避免一个标签关闭另一个。因此,当一组标签是Or(("tag", "other"))只是延长了前者的例子

from pyparsing import SkipTo, makeHTMLTags, Or 
open, close = makeHTMLTags(Or(("tag", "other"))) 
(open + SkipTo(close) + close).parseString("<other><tag> Tag content </tag></other>") 
# yields ['other', False, '<tag> Tag content ', '</tag>'] 

产生了不匹配的标签。解析器关闭开口<other></tag>。这可以通过为每个标签指定专用规则来修改。

from pyparsing import SkipTo, makeHTMLTags, Or 
Or((
    open + SkipTo(close) + close 
    for open, close in 
    map(makeHTMLTags, ("tag", "other")) 
)).parseString("<other><tag> Tag content </tag></other>") 
# yields ['other', False, '<tag> Tag content </tag>', '</other>'] 

现在我可以,例如,想找到的所有标签开始t,从而寻找Word('t', alphas),而不是Or(("tag", "other", ...))。如果要匹配的标记集合可能无限,我如何才能使标记匹配?

回答

0

我不熟悉pyparsing模块,但你的问题似乎可以通过lxml(Library for processing XML and HTML in Python)解决。以下是使用lxml的我的示例代码:

# -*- coding: utf-8 -*- 
from lxml import etree 


def pprint(l): 
    for i, tag in enumerate(l): 
     print 'Matched #%s: tag name=%s, content=%s' % (i + 1, tag.tag, tag.text) 


def main(): 
    # Finding all <tag> tags 
    pprint(etree.HTML('<tag>Tag content</tag>').xpath("//tag")) 

    # Finding all stags starts with "t" 
    pprint(etree.HTML('<tag>tag1 content</tag><tag2>tag2 conent</tag2><other>other</other>').xpath(
     "//*[starts-with(local-name(), 't')]")) 


if __name__ == '__main__': 
    main() 

这将输出:

Matched #1: tag name=tag, content=Tag content 
Matched #1: tag name=tag, content=tag1 content 
Matched #2: tag name=tag2, content=tag2 conent 

希望它能帮助。