Вы можете использовать BeautifulSoup для восстановления родительского содержимого следующим образом:
from bs4 import BeautifulSoup
import re
html = """<!DOCTYPE html>
<html>
<body>
<p>An absolute URL: https://www.w3schools.com</p>
<p>Another link: /11128107/opredelite-url-i-dobavte-metki-privyazki-ispolzuya-beautifulsoup</p>
<div><div>some div</div>Hello world from https://www.google.com</div>
</body>
</html>"""
soup = BeautifulSoup(html, "html.parser")
re_url = re.compile(r'(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)')
for tag in soup.find_all(text=True):
tags = []
url = False
for t in re_url.split(tag.string):
if re_url.match(t):
a = soup.new_tag("a", href=t, target='_blank')
a.string = t
tags.append(a)
url = True
else:
tags.append(t)
if url:
for t in tags:
tag.insert_before(t)
tag.extract()
print(soup)
print()
Это будет отображать следующий вывод:
<!DOCTYPE html>
<html>
<body>
<p>An absolute URL: <a href="https://www.w3schools.com" target="_blank">https://www.w3schools.com</a></p>
<p>Another link: <a href="/11128107/opredelite-url-i-dobavte-metki-privyazki-ispolzuya-beautifulsoup" target="_blank">/11128107/opredelite-url-i-dobavte-metki-privyazki-ispolzuya-beautifulsoup</a></p>
<div><div>some div</div>Hello world from <a href="https://www.google.com" target="_blank">https://www.google.com</a></div>
</body>
</html>
Это работает, сначала разбивая любые теги, содержащие текст, используярегулярное выражение для поиска любого URL.Для каждой записи, если это URL, замените его в списке новым тегом привязки.Если URL не найдены, оставьте тег в покое.Затем вставьте каждый список обновленных тегов перед существующим тегом, а затем удалите существующий тег.
Чтобы пропустить любые URL-адреса в DOCTYPE
, find_all()
можно изменить следующим образом:
from bs4 import BeautifulSoup, Doctype
...
for tag in soup.find_all(string=lambda text: not isinstance(text, Doctype)):