Denk darüber in „Stufen“. .. da einige x
die Wurzel des Unterbaums ist Sie in Betracht ziehen,
x.findAll(text='price')
ist die Liste aller Elemente in diesem Teilbaum mit Text 'price'
. Die Eltern dieser Elemente dann werden natürlich:
[t.parent for t in x.findAll(text='price')]
, und wenn Sie nur 'th'
diejenigen, deren „namen“ (Tag) behalten wollen, dann natürlich
[t.parent for t in x.findAll(text='price') if t.parent.name=='th']
und Sie wollen, dass die „nächsten Geschwister“ von denen, (aber nur, wenn sie sind auch 'th'
s), so
[t.parent.nextSibling for t in x.findAll(text='price')
if t.parent.name=='th' and t.parent.nextSibling and t.parent.nextSibling.name=='th']
Hier sehen Sie das Problem mit einer Liste Verständnis mit: zu viel Wiederholung, da wir nicht zuordnen können Zwischenergebnisse zu einfachen Namen. Schalten wir deshalb auf eine gute alte Masche ...:
bearbeiten: hinzugefügt Toleranz für eine Reihe von Text zwischen den Eltern th
und dem „nächsten Geschwister“ sowie Toleranz für letztere ein td
stattdessen sein, pro OPs Kommentar.
for t in x.findAll(text='price'):
p = t.parent
if p.name != 'th': continue
ns = p.nextSibling
if ns and not ns.name: ns = ns.nextSibling
if not ns or ns.name not in ('td', 'th'): continue
print ns.string
Ich habe ns.string
hinzugefügt, dass die nächsten Geschwister Inhalte geben, wenn und nur wenn sie sind nur Text (keine weiteren verschachtelten Tags) - natürlich Sie weiter an dieser Stelle statt analize kann, hängt davon ab, die Anforderungen Ihrer Anwendung! -). Ähnlich stelle ich mir vor, dass Sie nicht nur print
tun, aber etwas schlauer, aber ich gebe Ihnen die Struktur.
Gespräch über die Struktur, die Ankündigung, die zweimal I if...: continue
verwenden: Diese Verschachtelung reduziert im Vergleich zu der Alternative der if
‚s Bedingung Invertieren und Einrücken alle folgenden Anweisungen in der Schleife - und‚flach ist besser als nested‘ist einer der Koans im Zen von Python (import this
an einer interaktiven Aufforderung, sie alle zu sehen und zu meditieren ;-).
große Antwort Alex, ich habe gerade findAll bisher und jetzt fühle ich kann ich die Dom mit diesem Wissen durchqueren, gehen Python! hehe – Blankman
in der Verbindung 'wenn nicht ns oder ns.name ...', wenn ns ist None dann ns.name wird fehlschlagen nein? – Blankman
eigentlich mein HTML ist wie: