代码之家  ›  专栏  ›  技术社区  ›  majelbstoat

在HTML中,与标题后面的项匹配的正则表达式

  •  0
  • majelbstoat  · 技术社区  · 14 年前

    <h1 class="title">Title One</h1><p><a href="#">40.5</a><a href="#">31.3</a></p>

    <h1 class="title alternate">Title Two</h1><p><a href="#">12.1</a><a href="#">82.0</a></p>

    (在一个较大的文档中,摘录很可能会跨越多行)

    我如何构造一个正则表达式,在H1之后的第一个P中查找a标记中的文本?正则表达式将进入一个循环,这样我就可以传入头,以便检索后面的项。

    <a[^>]*>([0-9.]+?)</a>

    .+Title One.+<a[^>]*>([0-9.]+?)</a></p> 失败。

    我试着用向后看:

    (?<=Title One.+)<a[^>]*>([0-9.]+?)</a></p> 还有一些变化,但它只允许固定宽度的匹配(这里不会这样)。


    更新

    为了澄清上述情况,我想回复以下内容:

    {"Title One": ["40.5", "31.3"], "Title Two": ["12.1", "82.0"]}

    (这并不是说我需要帮助编写词典,但它确实演示了我如何需要与标题相关的值)。

    到目前为止,美女组看起来是最好的拍摄。LXML也可能会工作,因为源HTML并不是真正的标记汤-它的结构非常好,至少在我感兴趣的地方。


    5 回复  |  直到 14 年前
        1
  •  1
  •   MattH    14 年前

    这是你要找的东西吗?

    >>> from lxml import etree
    >>>
    >>> data = """
    ... <h1 class="title">Title One</h1><p><a href="#">40.5</a><a href="#">31.3</a></p>
    ... <h1 class="title alternate">Title Two</h1><p><a href="#">12.1</a><a href="#">82.0</a></p>
    ... """
    >>>
    >>> d = etree.HTML(data)
    >>> d.xpath('//h1/following-sibling::p[1]/a/text()')
    ['40.5', '31.3', '12.1', '82.0']
    

    此解决方案使用 lxml.etree 还有一个 xpath 表达。


    >>> from lxml import etree
    >>> from pprint import pprint
    >>>
    >>> data = """
    ... <h1 class="title">Title One</h1><p><a href="#">40.5</a><a href="#">31.3</a></p>
    ... <h1 class="title alternate">Title Two</h1><p><a href="#">12.1</a><a href="#">82.0</a></p>
    ... """
    >>>
    >>> d = etree.HTML(data)
    >>> #d.xpath('//h1[following-sibling::*[1][local-name()="p"]]') 
    ...
    >>> results = {}
    >>> for h in d.xpath('//h1[following-sibling::*[1][local-name()="p"]]'):
    ...   r = results.setdefault(str(h.text),[])
    ...   r += [ str(x) for x in h.xpath('./following-sibling::*[1][local-name()="p"]/a/text()') ]
    ...
    >>> pprint(results)
    {'Title One': ['40.5', '31.3'], 'Title Two': ['12.1', '82.0']}
    

    现在使用谓词向前看,这应该遍历 <h1> 紧跟其后的标签 <p> 标签。(铸件 tag.text

        2
  •  1
  •   Piskvor left the building Rohit Kumar    14 年前

    你说得对,regex绝对是错误的HTML匹配工具。

    不过,你的问题听起来和 Beautiful Soup

        3
  •  1
  •   bgporter    14 年前

    解决这个问题的另一个显而易见的答案是 BeautifulSoup --我喜欢它处理你经常在野外遇到的那种糟糕的html,尽可能地明智和优雅。

        4
  •  0
  •   nosklo    14 年前

    lxml.html .

    lxml.html文件 比BeautifulSoup更好地处理格式错误的html,它是主动维护的(BeautifulSoup不是),而且由于它使用 libxml2 在内部。

        5
  •  0
  •   ghostdog74    14 年前

    这里有一种使用普通字符串操作的方法

    html='''
    <h1 class="title">Title One</h1><p><a href="#">40.5</a>
    <a href="#">31.3</a></p>
    <h1 class="title alternate">Title Two</h1><p><a href="#">12.1</a><a href="#">82.0</a></p>
    '''
    
    for i in html.split("</a>"):
        if "<a href" in i:
            print i.split("<a href")[-1].split(">")[-1]
    

    $ python test.py
    40.5
    31.3
    12.1
    82.0
    

    我真的不明白你想得到什么,但如果你的要求很简单,是的,一个regex或一些字符串损坏可以做到这一点。不需要解析器。