Поскольку вы используете парсер html5lib , у вас есть доступ к белью, если вы используете BeautifulSoup версии 4.8.1 или выше, как описано в документах :
Синтаксические анализаторы html.parser
и html5lib
могут отслеживать, где в исходном документе был найден каждый тег. Вы можете получить доступ к этой информации как Tag.sourceline
(номер строки) и Tag.sourcepos
(позиция начального тега в строке) […]
В вашем примере вы можете легко получить доступ к этой информации:
from bs4 import BeautifulSoup
html = """<!DOCTYPE html>
<html>
<body>
<p align="left">
<b><font face="Times New Roman" size="5" color="red">Some text</font></b>
</p>
</body>
</html>
"""
soup = BeautifulSoup(html, "html5lib")
for elem in soup.find_all('font'):
print(elem.sourceline, elem.sourcepos, elem.string)
Это выведет 5 60 Some text
, где первый номер - ваш номер белья.
Если есть какая-либо потенциальная ошибка, например, получение NoneType
, вы должны позаботиться об этом до достижения ошибки. Поэтому вместо этого:
target = elem.findParent().findParent()
вы можете сначала проверить, получаете ли вы результат для вашего первого findParent()
-метода, а затем выполнить второй запрос, например:
target = elem.findParent()
err_line, err_source, err_str = target.sourceline, target.sourcepos, target.string
if target:
target = target.findParent()
else:
print(f"Error near line {err_line} ({err_source}). Last good text: {err_str}")