регулярное выражение Python для разделения строки на <a>элементов и извлечения ссылки + текст - PullRequest
1 голос
/ 11 июля 2019

Допустим, у меня есть несколько <a> элементов в строке:

s = 'Hello world. <a href="https://stackoverflow.com/">StackOverflow</a> is a great website. <a href="https://www.espn.com/">ESPN</a> is another great website.'

Цель состоит в том, чтобы разбить строку, чтобы я получил список, подобный приведенному ниже:

l = [
    "Hello world. ",
    {"link": "https://stackoverflow.com/", "title": "StackOverflow"},
    " is a great website. ",
    {"link": "https://www.espn.com/", "title": "ESPN"},
    " is another great website.",
]

Словари могут быть любым объектом, из которого я могу извлечь ссылку и заголовок.Есть ли регулярное выражение, которое я могу использовать для достижения этой цели?Или есть лучший способ сделать это?

Ответы [ 2 ]

5 голосов
/ 11 июля 2019

BeautifulSoup - лучший инструмент для анализа этой строки, чем регулярное выражение. Как правило, не используйте регулярные выражения для анализа HTML:

s = 'Hello world. <a href="https://stackoverflow.com/">StackOverflow</a> is a great website. <a href="https://www.espn.com/">ESPN</a> is another great website.'

from bs4 import BeautifulSoup, Tag, NavigableString

soup = BeautifulSoup(s, 'html.parser')

out = []

for c in soup.contents:
    if isinstance(c, NavigableString):
        out += [c]
    elif isinstance(c, Tag) and c.name == 'a' and 'href' in c.attrs:
        out += [{"link": c['href'], "title": c.text}]

from pprint import pprint
pprint(out)

Печать:

['Hello world. ',
 {'link': 'https://stackoverflow.com/', 'title': 'StackOverflow'},
 ' is a great website. ',
 {'link': 'https://www.espn.com/', 'title': 'ESPN'},
 ' is another great website.']
1 голос
/ 11 июля 2019

Если вы настаиваете на использовании регулярного выражения для этого:

import re

s = 'Hello world. <a href="https://stackoverflow.com/">StackOverflow</a> is a great website. <a href="https://www.espn.com/">ESPN</a> is another great website.'
sites = [{"link": link, "title": title} for link, title in zip(re.findall(r'<a href="(.*?)">', s), re.findall(r'>(.*?)</a>', s))]
print(sites)

Вывод:

[{'link': 'https://stackoverflow.com/', 'title': 'StackOverflow'}, {'link': 'https://www.espn.com/', 'title': 'ESPN'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...