Python -- 正则表达式 -- 如何找到两个字符串之间的字符串

6 投票
4 回答
21203 浏览
提问于 2025-04-15 11:31

考虑以下内容:

<div id=hotlinklist>
  <a href="foo1.com">Foo1</a>
  <div id=hotlink>
    <a href="/">Home</a>
  </div>
  <div id=hotlink>
    <a href="/extract">Extract</a>
  </div>
  <div id=hotlink>
    <a href="/sitemap">Sitemap</a>
  </div>
</div>

你会怎么用python里的正则表达式把网站地图那一行提取出来呢?

<a href="/sitemap">Sitemap</a>

下面的代码可以用来提取链接标签。

'/<a(.*?)a>/i'

不过,链接标签有很多个。而且还有很多热链接,所以我们也不能仅仅依靠这些方法,对吧?

4 个回答

5

为了提取标语的内容:

    <a href="/sitemap">Sitemap</a>

... 我会使用:

    >>> import re
    >>> s = '''
    <div id=hotlinklist>
    <a href="foo1.com">Foo1</a>
      <div id=hotlink>
        <a href="/">Home</a>
      </div>
      <div id=hotlink>
        <a href="/extract">Extract</a>
      </div>
      <div id=hotlink>
        <a href="/sitemap">Sitemap</a>
      </div>
    </div>'''
    >>> m = re.compile(r'<a href="/sitemap">(.*?)</a>').search(s)
    >>> m.group(1)
    'Sitemap'
6

用正则表达式解析HTML是个坏主意!

想想下面这段HTML:

<a></a > <!-- legal html, but won't pass your regex -->

<a href="/sitemap">Sitemap<!-- proof that a>b iff ab>1 --></a>

这样的例子还有很多。正则表达式在很多方面都很好用,但解析HTML就不行。

你应该考虑使用Beautiful Soup这个Python的HTML解析器。

不过,如果你非要用正则表达式来解决这个问题,可以这样做:

import re

data = """
<div id=hotlinklist>
  <a href="foo1.com">Foo1</a>
  <div id=hotlink>
    <a href="/">Home</a>
  </div>
  <div id=hotlink>
    <a href="/extract">Extract</a>
  </div>
  <div id=hotlink>
    <a href="/sitemap">Sitemap</a>
  </div>
</div>
"""

e = re.compile('<a *[^>]*>.*</a *>')

print e.findall(data)

输出结果:

>>> e.findall(data)
['<a href="foo1.com">Foo1</a>', '<a href="/">Home</a>', '<a href="/extract">Extract</a>', '<a href="/sitemap">Sitemap</a>']
13

别用正则表达式。用BeautifulSoup,这是一个用来解析HTML的工具。

from BeautifulSoup import BeautifulSoup

html = \
"""
<div id=hotlinklist>
  <a href="foo1.com">Foo1</a>
  <div id=hotlink>
    <a href="/">Home</a>
  </div>
  <div id=hotlink>
    <a href="/extract">Extract</a>
  </div>
  <div id=hotlink>
    <a href="/sitemap">Sitemap</a>
  </div>
</div>"""

soup = BeautifulSoup(html)
soup.findAll("div",id="hotlink")[2].a

# <a href="/sitemap">Sitemap</a>

撰写回答