[PYTHON] BeautifulSoup-Trick: Entscheiden Sie das Tag, indem Sie den Pfad angeben

Wenn der Teil, den Sie aus XML / HTML extrahieren möchten, ein charakteristisches Tag enthält, kann BeautifulSoup nach diesem Tag als Schlüsselwort suchen, was sehr nützlich ist. Wenn es jedoch kein Tag mit solchen Merkmalen gibt, bleibt keine andere Wahl, als den Tags in der Reihenfolge vom Root-Tag zum Ziel-Tag zu folgen. BeautifulSoup unterstützt XPATH nicht, daher bin ich bei dieser Art der Erkundung etwas schwach.

Daher habe ich eine Funktion erstellt, um das Tag durch Angabe eines einfachen Pfads zu bestimmen.

** Wie man PATH angibt ** (1) Grundform - Die Elementnamen der Tags werden durch '/' getrennt und in der Reihenfolge angeordnet.   html/body/table/tr/td "First td under first tr under first table under body"

(2) Auswahl von Geschwister-Tags - Geben Sie die Reihenfolge n (1 bis) an, in der die zu extrahierenden Tags mit '[n]' angezeigt werden.   html/body/table[1]/tr[3]/td "Der erste td unter dem dritten tr unter dem ersten Tisch unter dem Körper"

b4_path.py


from bs4 import BeautifulSoup
import re

#<SUBROUTINE>###################################################################
# Function:Suchen Sie das Root-Tag eines beliebigen Tags
################################################################################
def root(self):
    if self.name == u'[document]':
        return self
    else:
        return [node for node in self.parents][-1]

BeautifulSoup.root = root

#<SUBROUTINE>###################################################################
# Function:Extrahiert ein bestimmtes Tag, das im einfachen PATH angegeben ist
# 
################################################################################
def path(self, path):
    re_siblings = re.compile(r'(\w+)\[(\d+)\]')

    if path[0] == '/':
        node = self.root()
    else:
        node = self

    path = path.strip('/')
    for arrow in path.split('/'):
        if arrow == 'tbody':
            continue

        match = re_siblings.match(arrow)
        if match:
            arrow = match.group(1)
            num   = int(match.group(2))-1
            node  = node.find_all(arrow, recursive=False)[num]
        else:
            node  = getattr(node, arrow)
    return node
    
BeautifulSoup.path = path

#<TEST>#########################################################################
# Function:Testroutine
################################################################################
if __name__ == '__main__':
    soup = BeautifulSoup("""
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
""")

    print soup.path('/html/body/p[2]/a[1]').prettify()

Recommended Posts

BeautifulSoup-Trick: Entscheiden Sie das Tag, indem Sie den Pfad angeben
Importieren Sie, indem Sie den Verzeichnispfad direkt angeben
BeautifulSoup-Trick: Fragen Sie nach dem Root-Tag
Installieren Sie, indem Sie die Version mit pip angeben
Lesen Sie die Datei, indem Sie den Zeichencode angeben.
Lassen Sie uns den Datumsverlauf durch Kombinationsoptimierung festlegen
Sortieren Sie die Elemente eines Arrays, indem Sie Bedingungen angeben
Python3 datetime ist schneller, wenn nur die Zeitzone angegeben wird
Umbenennen von Dateien unter Verwendung des vollständigen Pfads, der von der Shell empfangen wurde
[Python] Rufen Sie das Element ab, indem Sie das Namensattribut in BeautifulSoup angeben
Greifen Sie auf Github zu, indem Sie den SSH-Schlüssel in GitPython angeben
Extrahieren Sie das Element, indem Sie das in der Zeichenfolge enthaltene Tag löschen
[Python] Löschen Sie, indem Sie ein Tag mit Beautiful Soup angeben
Holen Sie sich den vollständigen Pfad, auf den .lnk verweist, mit wsl