2 Stimmen

Sobald ich den Anfangs- und Endteil eines Abschnitts eines HTML-Dokuments mit lxml identifiziert habe, wie bekomme ich alles dazwischen?

Ich arbeite mit einigen HTML-Dateien. Ich versuche herauszufinden, wie ich zuverlässig zu einigen Texten gelangen kann, die in den Dokumenten vorhanden sind. Ich weiß, dass der Abschnitt, den ich möchte, mit fett gedruckten Worten beginnt und mit anderen fett gedruckten Worten endet.

bolded_item = atree.cssselect('b')

myKeys = [item for item in bolded_items if item.text if 'KEY' in item.text]

Also ist myKeys eine Liste, deren Elemente Elemente von atree sind, speziell Elemente, die fett gedruckten Text haben und das Wort 'KEY' im Text enthalten.

Jetzt möchte ich alle Teile des Baums zwischen beliebigen 2 Elementen in myKeys identifizieren. Ich möchte in der Lage sein, sie auf verschiedene Weisen zu manipulieren. Ich habe mit getparent, getchildren, getnext und allen anderen Methoden herumgespielt, die wahrscheinlich aussahen, nachdem ich dir(myKeys[0]) ausgeführt habe, aber ich komme nicht weiter.

Alle Vorschläge sind willkommen

1voto

Daniel Kluev Punkte 10335

Ich würde vorschlagen, SAX für diese Aufgabe zu verwenden.

Grundlegende Dokumentationen sind verfügbar unter http://lxml.de/sax.html#producing-sax-events-from-an-elementtree-or-element

Ihr Handler sollte Ereignisse konsumieren, ohne irgendwelche Aktionen auszuführen, bis er das benötigte fettgedruckte Element erhält, und dann schreibt er Ereignisse in einen neuen Puffer/Baum/was auch immer, bis er das terminierende fettgedruckte Element erhält.

0voto

PyNEwbie Punkte 4756

Im Geiste von SO habe ich herausgefunden, was meiner Meinung nach die beste Antwort ist, und werde sie selbst veröffentlichen.

import lxml
from lxml import html
testFile=open(r'c:\temp\testlxml.htm').read()
aTree=html.fromstring(testFile)
bolds=aTree.cssselect('b')
theTitles=[item.text for item in bolds if item.text if 'KEY' in item.text]
theBoldKeys=[item for item in bolds if item.text if 'KEY' in item.text]
theFullList=[]
for e in aTree.iter():
    theFullList.append(e)

for numb,item in enumerate(theFullList):
    if item==theBoldItems[0]:
        first=numb
    if item==theBoldItems[1]:
        second=numb
theText=[]
for item in theFullList[first:second]:
    if item.text:
        theText.append(item.text)
    if item.tail:
       theText.append(item.tail)

aString=' '.join(theText)

Eine kleine Erklärung.

Mein Ziel ist es, einige Logik auf die fett gedruckten Teile der Dokumente anzuwenden, da diese fett gedruckten Abschnitte, die das Wort KEY enthalten, verschiedene Abschnitte des Dokuments definieren. TheTitles ist eine Liste der fett gedruckten Elemente, die das Wort 'KEY' enthalten. Basierend auf meinen speziellen Bedürfnissen möchte ich möglicherweise den gesamten Text zwischen zwei Elementen aus TheTitles haben, ich kann Tests erstellen und die erforderliche Logik, um Elemente aus TheTitles auszuwählen.

theBoldItems ist eine Liste der tatsächlichen Elemente, für jedes i gilt TheTitles[i]==theBoldItems[i].text

Als nächstes erhalte ich die FullList, die alle HTML-Elemente im Baum enthält. Da LXML den Baum in einer festgelegten Reihenfolge aufbaut, weiß ich, dass ich alle Elemente zwischen theBoldItems[i] und theBoldItems[i+1] erfassen möchte. Und das Gute ist, dass der Test in Python so einfach ist.

Jetzt kann ich den Text für all diese Elemente erhalten und obwohl ich ihn noch etwas aufräumen muss, habe ich erfolgreich den gesamten Text zwischen beliebigen zwei Elementen extrahiert, die ich möchte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X