Limit hloubka tag.text

hlasů
0

Já prostě nemůže to dopadnout dobře. BeautifulSoup4 je tak matoucí.

Snažím se opravit nevyškvařeného srážky odkazy v HTML textu. Regex je:

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

Vzhledem k tomu, zdánlivě BS4 použití matchs regulárními výrazy, udělal jsem regex širší s

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

Cílem je najít takové řetězce a nahradit je s aktuálními <a>odkazy, ale ne v případě, že jsou v <code>tagu (ať už je hloubka). Mám mapování získat URL ze identifier.

[<code>title<code>][identifier]měl být uzavřeno, ale <code>[title][identifier]</code>neměli.

V případě, že vstup je:

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

Výstupem by měla být:

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

Nicméně následující vstup by měl zůstat nedotčen:

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

Zkoušel jsem následující:

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

... ale chyběla tagy. Zjistil jsem vysvětlení v tomto post: BeautifulSoup - vyhledávání podle textu do tagu . Zdá se, že text(nebo nový název string, i když jsem našel chování, které se liší) se vrátí None, když existují i jiné značky ve značce, což znamená, že značka <p>[<code>title<code>][identifier]</p>nebude uzavřeno.

Také jsem si myslel, že po dala řešení:

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

... ale nyní místo toho, aby mě označí v blízkosti listy, vrátí kořenové značky jako <html>a <body>, protože tag.textvrátí plná, rekurzivní znění všech potomků . Potom samozřejmě tyto značky obsahuje text vyhovující regex, ale uvnitř <code>značky .

Nejlepším řešením, myslím, že by bylo vyzkoušet regulární výraz proti textu tagu omezena do určité hloubky. Pokud hloubky 1 text <p>[<code>title</code>][identifier]</p>je [ ][identifier]a hloubku 2 text stejné značky je [<code>title</code>][identifier], pak hloubka-2 je vše, co potřebuji.

Existuje způsob, jak to udělat? Nebo máte nějaké jiné řešení na mysli? Myslel jsem, že bych mohl opakovat u všech značek z listů ke kořeni, do šířky, ale budu mít stále stejný problém s tag.textnávratem textu všemi potomky stejně.

Položena 19/03/2020 v 22:00
zdroj uživatelem
V jiných jazycích...                            

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