Python - Regex - Как найти строку между двумя наборами строк - PullRequest
6 голосов
/ 12 мая 2009

Рассмотрим следующее:

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

13 голосов
/ 12 мая 2009

Не используйте регулярные выражения. Используйте BeautfulSoup , анализатор 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>
6 голосов
/ 12 мая 2009

Разбор 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>']
5 голосов
/ 12 мая 2009

Чтобы извлечь содержимое лозунга:

    <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'
1 голос
/ 12 мая 2009

Используйте BeautifulSoup или lxml , если вам нужно проанализировать HTML.

Кроме того, что вам действительно нужно делать? Найти последнюю ссылку? Найти третью ссылку? Найти ссылку, которая указывает на / sitemap? Непонятный от вас вопрос. Что нужно сделать с данными?

Если вам действительно нужно использовать регулярные выражения, взгляните на findall.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...