मैं सिर्फ यह सही नहीं मिल सकता है। BeautifulSoup4 इतना भ्रमित कर रहा है।
मैं HTML पाठ में unrendered Markdown संदर्भ ठीक करने के लिए कोशिश कर रहा हूँ। regex है:
REF = re.compile(r\[(?P<title>.+?)\]\[(?P<identifier>.*?)\])
जाहिरा तौर पर BS4 का उपयोग करता है के बाद से match
नियमित अभिव्यक्ति के साथ, मैं साथ regex व्यापक बनाया
REF = re.compile(r.*\[(?P<title>.+?)\]\[(?P<identifier>.*?)\].*, re.DOTALL)
लक्ष्य इस तरह के तार खोजने के लिए और उन्हें वास्तविक साथ बदलने के लिए है <a>
लिंक, लेकिन नहीं अगर वे एक में हैं <code>
टैग (जो कुछ भी गहराई)। मैं से URL प्राप्त करने के लिए एक मानचित्रण है identifier
।
[<code>title<code>][identifier]
मिलान किया जाना चाहिए, लेकिन <code>[title][identifier]</code>
नहीं करना चाहिए।
यदि इनपुट है:
<p>[<code>title<code>][identifier]</p>
उत्पादन किया जाना चाहिए:
<p><a id=identifier href=http://example.com><code>title<code></a></p>
हालांकि निम्न इनपुट अछूता रहना चाहिए:
<p><code>[title][identifier]</code></p>
मैं निम्नलिखित की कोशिश की:
tags = [tag.parent for tag in soup.find_all(text=REF) if not tag.find_parent(code)]
... लेकिन यह टैग याद आ रही थी। मैं इस पोस्ट में एक स्पष्टीकरण मिल गया: BeautifulSoup - एक टैग के अंदर पाठ के आधार पर खोज । ऐसा लगता है text
(या नया नाम string
है, हालांकि मैं व्यवहार भिन्न हो पाया) वापस आ जाएगी None
जब वहाँ टैग में अन्य टैग कर रहे हैं, जिसका अर्थ है टैग <p>[<code>title<code>][identifier]</p>
मिलान नहीं किया जा जाएगा।
मैं यह भी सोचा पद समाधान दिया:
tags = list(
soup.find_all(
lambda tag: tag.name != code and
not tag.find_parent(code) and
REF.search(tag.text)
)
)
... लेकिन अब मुझे देने के बजाय, पत्तियों के करीब टैग किए जाने पर ऐसा लगता है कि जड़ टैग रिटर्न <html>
और <body>
, क्योंकि tag.text
रिटर्न भरा, सभी सन्तान की पुनरावर्ती पाठ । तो निश्चित रूप से इन टैग regex मिलान पाठ है, लेकिन होता है अंदर <code>
टैग ।
सबसे अच्छा समाधान, मुझे लगता है, जिसे टैग का पाठ एक निश्चित गहराई तक ही सीमित के खिलाफ regex कोशिश करने के लिए किया जाएगा। की गहराई -1 पाठ तो <p>[<code>title</code>][identifier]</p>
है [ ][identifier]
ही टैग की गहराई -2 पाठ है [<code>title</code>][identifier]
, तो गहराई -2 सब मैं की जरूरत है।
क्या ऐसा करने के लिए कोई रास्ता है? या फिर आप के मन में किसी अन्य समाधान है? मैंने सोचा था कि शायद मैं जड़, चौड़ाई-पहले के पत्तों से सभी टैग पर पुनरावृति सकता है, लेकिन मैं अभी भी साथ एक ही समस्या है tag.text
और साथ ही सभी सन्तान 'पाठ लौटने।