profondeur de limite de tag.text

voix
0

Je ne peux pas faire les choses. BeautifulSoup4 est tellement confus.

Je suis en train de fixer des références unrendered Markdown dans le texte HTML. Le regex est:

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

Depuis apparemment BS4 utilisations matchavec des expressions régulières, je fis la plus large avec regex

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

L'objectif est de trouver les chaînes et les remplacer par des réels <a>liens, mais pas si elles sont dans une <code>balise (quelle que soit la profondeur). J'ai un mappage pour obtenir l'URL du identifier.

[<code>title<code>][identifier]doit être adapté, mais <code>[title][identifier]</code>ne devrait pas.

Si l'entrée est:

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

La sortie doit être:

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

Cependant, l'entrée suivante doit rester intacte:

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

J'ai essayé les éléments suivants:

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

... mais il a été balises manquantes. J'ai trouvé une explication dans ce post: BeautifulSoup - recherche par texte dans une balise . Il semble text(ou le nouveau nom string, si j'ai trouvé que le comportement est différent) sera de retour Nonequand il y a d' autres balises dans la balise, ce qui signifie la balise <p>[<code>title<code>][identifier]</p>ne sera pas égalé.

Je pensais aussi le poste a la solution:

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

... mais maintenant au lieu de me donner des balises près des feuilles, il retourne balises racine comme <html>et <body>parce que tag.textrenvoie le plein texte récursif de tous les descendants . Alors bien sûr , ces balises contient du texte correspondant à l'expression rationnelle, mais à l' intérieur des <code>balises .

La meilleure solution, je pense, serait d'essayer l'expression rationnelle contre le texte de l'étiquette limitée à une certaine profondeur. Si le texte de profondeur 1 <p>[<code>title</code>][identifier]</p>est [ ][identifier]et le texte profondeur 2 de la même étiquette est [<code>title</code>][identifier], puis la profondeur 2 est tout besoin I.

Y-a-t-il un moyen de faire ça? Ou avez - vous une autre solution à l' esprit? Je pensais que je pourrais peut - être itérer sur toutes les étiquettes des feuilles à la racine, en largeur, mais je vais avoir toujours le même problème avec tag.textretour le texte de tous les descendants ainsi.

Créé 19/03/2020 à 22:00
source utilisateur
Dans d'autres langues...                            

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