Глубина Предел tag.text

голоса
0

Я просто не могу получить это право. BeautifulSoup4 настолько запутанным.

Я пытаюсь исправить непревращаемую ссылку Markdown в HTML-тексте. Регулярное выражение:

REF = re.compile(r\[(?P<title>.+?)\]\[(?P<identifier>.*?)\])

Так видимо BS4 использования matchс регулярными выражениями, я сделал регулярное выражение шире

REF = re.compile(r.*\[(?P<title>.+?)\]\[(?P<identifier>.*?)\].*, re.DOTALL)

Цель состоит в том, чтобы найти такие строки и заменить их с реальными <a>ссылками, но если они находятся в <code>теге (независимо от глубины). У меня есть отображение , чтобы получить URL из identifier.

[<code>title<code>][identifier]должны быть согласованы, но <code>[title][identifier]</code>не должны.

Если вход:

<p>[<code>title<code>][identifier]</p>

Вывод должен быть:

<p><a id=identifier href=http://example.com><code>title<code></a></p>

Однако следующий вход должен оставаться нетронутым:

<p><code>[title][identifier]</code></p>

Я попытался следующие:

tags = [tag.parent for tag in soup.find_all(text=REF) if not tag.find_parent(code)]

... но в ней не хватает тегов. Я нашел объяснение в этом посте: BeautifulSoup - поиск по тексту внутри тега . Кажется text(или новое имя string, хотя я нашел поведение отличаться друг от друга) будет возвращаться , Noneкогда есть другие теги в тег, то есть тег <p>[<code>title<code>][identifier]</p>не будет соответствовать.

Я также думал, что пост дал решение:

tags = list(
    soup.find_all(
        lambda tag: tag.name != code and
                    not tag.find_parent(code) and
                    REF.search(tag.text)
    )
)

... но теперь вместо того , чтобы дать мне тег близко к листам, она возвращает корневые тег , как <html>и <body>, так как tag.textвозвращает полный, рекурсивный текст всех потомков . Тогда, конечно , эти теги содержат текст , соответствующий регулярное выражение, но внутри <code>тег .

Лучшее решение, я думаю, было бы попробовать регулярное выражение против текста тега ограничен определенной глубины. Если глубина 1 текст <p>[<code>title</code>][identifier]</p>является [ ][identifier]и глубины 2 текста того же тега [<code>title</code>][identifier], то глубина 2 все потребности я.

Есть способ сделать это? Или у вас есть какие - либо другие решения в виду? Я думал , может быть , я мог бы итерацию по всем тегам от листьев к корню, в ширине первой, но я по- прежнему имею те же проблемы с tag.textвозвращением текста всех потомков, а также.

Задан 20/03/2020 в 00:00
источник пользователем
На других языках...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more