limite di profondità tag.text

voti
0

Non riesco proprio a farlo bene. BeautifulSoup4 è così confuso.

Sto cercando di risolvere i riferimenti Markdown non renderizzati in testo HTML. La regex è:

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

Dal momento che a quanto pare BS4 usi matchcon le espressioni regolari, ho fatto la regex più ampio con

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

L'obiettivo è di trovare tali stringhe e sostituirli con veri <a>legami, ma non se sono in un <code>tag (qualunque sia la profondità). Ho una mappatura per ottenere l'URL dal identifier.

[<code>title<code>][identifier]dovrebbe essere abbinato, ma <code>[title][identifier]</code>non dovrebbe.

Se l'ingresso è:

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

L'output dovrebbe essere:

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

Tuttavia il seguente ingresso dovrebbe rimanere intatta:

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

Ho provato quanto segue:

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

... ma mancava tag. Ho trovato una spiegazione in questo post: BeautifulSoup - Ricerca per testo all'interno di un tag . Sembra text(o il nuovo nome string, anche se ho trovato il comportamento di essere diversi) restituirà Nonequando ci sono altri tag nel tag, il che significa il tag <p>[<code>title<code>][identifier]</p>non viene abbinato.

Ho anche pensato che il posto ha dato la soluzione:

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

... ma ora invece di darmi tag vicino alle foglie, restituisce i tag radice come <html>e <body>perché tag.texti rendimenti del testo completo e ricorsiva di tutti i discendenti . Poi, naturalmente, questi tag contiene testo corrispondente al regex, ma all'interno di <code>tag .

La soluzione migliore, credo, sarebbe quello di provare l'espressione regolare contro il testo del tag limitato ad una certa profondità. Se la profondità-1 testo <p>[<code>title</code>][identifier]</p>è [ ][identifier]e profondità-2 del testo dello stesso tag è [<code>title</code>][identifier], allora la profondità-2 è tutto bisogno io.

C'è un modo per farlo? O avete qualsiasi altra soluzione in mente? Ho pensato che forse avrei potuto iterare su tutti i tag dalle foglie alla radice, in ampiezza, ma io ancora lo stesso problema con tag.textil ritorno del testo tutti i discendenti pure.

È pubblicato 19/03/2020 alle 22:00
fonte dall'utente
In altre lingue...                            

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