βάθος Όριο tag.text

ψήφοι
0

Απλά δεν μπορώ να το πάρει σωστό. BeautifulSoup4 είναι τόσο σύγχυση.

Προσπαθώ να διορθώσετε τα ακατέργαστα αναφορές Markdown σε κείμενο HTML. Το 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)]

... αλλά έλειπε ετικέτες. Βρήκα μια εξήγηση σε αυτό το post: BeautifulSoup - αναζήτηση με το κείμενο μέσα σε ένα tag . Φαίνεται 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την επιστροφή κείμενο όλοι οι απόγονοι, καθώς και.

Δημοσιεύθηκε 19/03/2020 στις 22:00
πηγή χρήστη
Σε άλλες γλώσσες...                            

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