Python, регулярное выражение, чтобы найти якорную ссылку HTML - PullRequest
0 голосов
/ 21 января 2010

Мне нужно регулярное выражение в Python, чтобы найти ссылки HTML в большем наборе HTML.

так что если у меня есть:

<ul class="something">
<li id="li_id">
<a href="#" title="myurl">URL Text</a>
</li>
</ul>

Я бы вернулся:

<a href="#" title="myurl">URL Text</a>

Я бы хотел сделать это с помощью регулярного выражения, а не Beautifulsoup или чего-то подобного. У кого-нибудь есть фрагмент, который я могу использовать для этого?

Спасибо

Ответы [ 3 ]

4 голосов
/ 21 января 2010

Суп хорош для вас:

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup('''<ul class="something">
... <li id="li_id">
... <a href="#" title="myurl">URL Text</a>
... </li>
... </ul>''')

Есть много аргументов, которые вы можете передать методу findAll; больше здесь . Одна строка ниже поможет вам начать с возвращения списка всех ссылок, соответствующих некоторым условиям.

>>> soup.findAll(href='#', title='myurl')
[<a href="#" title="myurl">URL Text</a>]

Редактировать: на основе комментария ОП, добавлена ​​информация:

Допустим, вас интересуют только теги в элементах списка определенного класса <li class="li_class">. Вы можете сделать что-то вроде этого:

>>> soup = BeautifulSoup('''<li class="li_class">
    <a href="#" title="myurl">URL Text</a>
    <a href="#" title="myurl2">URL Text2</a></li><li class="foo">
    <a href="#" title="myurl3">URL Text3</a></li>''') # just some sample html

>>> for elem in soup.findAll("li", "li_class"):
...   pprint(elem.findAll('a')) # requires `from pprint import pprint`
... 
[<a href="#" title="myurl">URL Text</a>,
 <a href="#" title="myurl2">URL Text2</a>]

Рецепт супа:

  1. Загрузите один необходимый файл.
  2. Поместите файл dl'd в каталог site-packages или аналогичный.
  3. Наслаждайтесь своим супом.
3 голосов
/ 21 января 2010

вы действительно не должны использовать регулярные выражения для разбора HTML ... никогда.

попробуйте Beautifulsoup или lxml.

но ... ты спросил. так что быстрая и наивная версия может выглядеть так:

import re

html = """
<ul class="something">
<li id="li_id">
<a href="#" title="myurl">URL Text</a>
</li>
</ul>
"""

m = re.search('(<a .*>)', html)
if m:
    print m.group(1)

Я могу придумать, как это сломается.

1 голос
/ 21 января 2010

вы можете попробовать это, так как ваше требование простое. Не нужно BeautifulSoup или регулярное выражение

>>> s="""
... <ul class="something">
... <li id="li_id">
... <a href="#" title="myurl">URL Text</a>
... </li>
... </ul>
... """
>>> for item in s.split("</a>"):
...    if "<a href=" in item :
...        print item [ item.find("<a href=") : ] + "</a>"
...
<a href="#" title="myurl">URL Text</a>

При желании вы можете включить проверку '<li class="li_class">' в операторе if.

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