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