tag.text sınırı derinliği

oy
0

Sadece bunu doğru alınamıyor. BeautifulSoup4 yüzden karıştırıyor.

HTML metninde işlenmeyen Markdown başvuruları düzeltmek için çalışıyorum. regex geçerli:

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

Görünüşe BS4 kullanımlar yana matchdüzenli ifadelerle, beraber regex daha geniş yapılmış

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

Amaç bu tür dizeleri bulmak ve gerçek onları değiştirmektir <a>ancak onlar ise, bağlantıları <code>etiketi (her ne derinlik). Ben URL'yi almak için bir eşleme identifier.

[<code>title<code>][identifier]should eşleşti ancak <code>[title][identifier]</code>olmamalı.

giriş ise:

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

Çıkış şöyle olacaktır:

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

Ancak şu giriş bakir kalmalı:

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

Aşağıdaki çalıştı:

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

... ama etiketleri eksikti. Bu yazı bir açıklama bulundu: BeautifulSoup - bir etiket içinde metne göre arama . Öyle görünüyor text(ya da yeni adı stringdönecektir ben davranışı farklı olduğu saptanırsa da,) Noneetiketi anlamına gelen etiket içindeki diğer etiketler varken <p>[<code>title<code>][identifier]</p>eşleşti edilmeyecektir.

Ben de sonrası çözümünü verdi düşündüm:

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

... ama şimdi yerine beni verme, yaprakları yakın etiketleri neye kök etiketleri döndürür <html>ve <body>çünkü tag.textgetiri tüm soyundan dolu, özyinelemeli metin . Sonra tabii bu etiketler regex eşleşen metni, ancak içeren <code>etiketleri .

En iyi çözüm, bence, belli bir derinliğe kadar sınırlı etiketinin metninde karşı regex çalışmak olacaktı. Derinliği-1 metin halinde <p>[<code>title</code>][identifier]</p>olduğunu [ ][identifier]ve aynı etiketi derinliği-2 metindir [<code>title</code>][identifier], ardından derinlik-2, tüm ı ihtiyacıdır.

Bunu yapmanın bir yolu var mı? Yoksa aklında başka bir çözüm var mı? Yani, belki de kökü, genişlik öncelikli için yapraklardan tüm etiketlere yineleme sandım, ama hala aynı sorun olacak tag.texttüm soyunu metin dönen de.

Oluştur 19/03/2020 saat 22:00
kaynak kullanıcı
Diğer dillerde...                            

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