Profundidade limite de tag.text

votos
0

Eu apenas não posso obtê-lo direito. BeautifulSoup4 é tão confuso.

Eu estou tentando corrigir referências Markdown unrendered em texto HTML. O regex é:

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

Desde aparentemente BS4 usos matchcom expressões regulares, eu fiz a regex mais ampla com

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

O objetivo é encontrar essas cordas e substituí-los por reais <a>links, mas não se eles estão em uma <code>tag (seja qual for a profundidade). Eu tenho um mapeamento para obter o URL do identifier.

[<code>title<code>][identifier]deve ser combinado, mas <code>[title][identifier]</code>não deveria.

Se a entrada é:

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

A saída deve ser:

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

No entanto, a entrada seguinte deve permanecer intocado:

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

Eu tentei o seguinte:

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

... mas estava faltando tags. Eu encontrei uma explicação neste post: BeautifulSoup - busca por texto dentro de um tag . Parece text(ou o novo nome string, embora eu achei o comportamento a ser diferente) irá retornar Nonequando há outras tags na tag, ou seja, a tag <p>[<code>title<code>][identifier]</p>não será correspondido.

Eu também pensei que o cargo deu a solução:

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

... mas agora, em vez de dar-me etiquetas perto das folhas, ele retorna marcas de raiz como <html>e <body>porque tag.textretorna o texto integral, recursivo de todos os descendentes . Então é claro que essas marcas contém texto correspondente a regex, mas dentro de <code>marcas .

A melhor solução, eu acho, seria tentar a regex contra o texto da tag limitado a uma certa profundidade. Se a profundidade-1 texto <p>[<code>title</code>][identifier]</p>é [ ][identifier]e profundidade-2 texto da mesma marca é [<code>title</code>][identifier], em seguida, profundidade-2 é tudo necessidade I.

Existe uma maneira de fazer isso? Ou você tem qualquer outra solução em mente? Eu pensei que talvez eu pudesse interagir em todas as tags das folhas para a raiz, em largura, mas eu ainda vou ter o mesmo problema com tag.texto retorno de texto todos os descendentes também.

Publicado 19/03/2020 em 22:00
fonte usuário
Em outras línguas...                            

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