Мне нужно обработать большой архив очень грязного HTML, заполненного посторонними таблицами, интервалами и встроенными стилями, в уценку.
Я пытаюсь использовать Beautiful Soup для выполнения этой задачи, и моя цель в основном заключается в выводе функции get_text()
, за исключением сохранения тегов привязки с href
без изменений.
В качестве примера я хотел бы преобразовать:
<td>
<font><span>Hello</span><span>World</span></font><br>
<span>Foo Bar <span>Baz</span></span><br>
<span>Example Link: <a href="https://google.com" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #395c99;font-weight: normal;text-decoration: underline;">Google</a></span>
</td>
В:
Hello World
Foo Bar Baz
Example Link: <a href="https://google.com">Google</a>
До сих пор мой мыслительный процесс состоял в том, чтобы просто захватить все теги и развернуть их все, если они не являются якорями, но это заставляет текст повторяться несколько раз, так как soup.find_all(True)
возвращает рекурсивно вложенные теги в виде отдельных элементов:
#!/usr/bin/env python
from bs4 import BeautifulSoup
example_html = '<td><font><span>Hello</span><span>World</span></font><br><span>Foo Bar <span>Baz</span></span><br><span>Example Link: <a href="https://google.com" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #395c99;font-weight: normal;text-decoration: underline;">Google</a></span></td>'
soup = BeautifulSoup(example_html, 'lxml')
tags = soup.find_all(True)
for tag in tags:
if (tag.name == 'a'):
print("<a href='{}'>{}</a>".format(tag['href'], tag.get_text()))
else:
print(tag.get_text())
Возвращает несколько фрагментов / дубликатов при перемещении синтаксического анализатора по дереву:
HelloWorldFoo Bar BazExample Link: Google
HelloWorldFoo Bar BazExample Link: Google
HelloWorldFoo Bar BazExample Link: Google
HelloWorld
Hello
World
Foo Bar Baz
Baz
Example Link: Google
<a href='https://google.com'>Google</a>