_FFXpath mit XPather

  • Ich habe die fantastische Funktion "_FFXPath" gefunden und nutze sie auch schon, um bestimmte Text-Bereiche auszulesen... :)

    Ist es auch möglich, BIS zu dem Text zu suchen und dann den nächsten Image-Tag zu wählen und den Source dann auszugeben?^^...
    Das konnte ich jetzt da irgendwie nicht heraus lesen...


    LG :)

    2 Mal editiert, zuletzt von Acanis (28. Oktober 2009 um 10:52)

  • Hallo,

    einfachstes Beispiel - erstes Bild ohne irgendwelche Merkmale:

    [autoit]

    $sSrc = _FFXpath("//img", "src", 9)
    ; oder
    $sSrc = _FFXpath("//img/@src")

    [/autoit]

    der zweite Parameter gibt an, von welchem Attribut man den Wert zurück haben möchte.
    Default = textContent
    d.h.

    [autoit]

    $sLinkText = _FFXpath("//a", "textContent", 9)
    ;==
    $sLinkText = _FFXpath("//a", Default, 9)
    ;==
    $sLinkText = _FFXpath("//a")

    [/autoit]

    Bis zu einem bestimmten Text zu suchen und darin das IMG zu suchen ist nicht direkt möglich, da alles über den XPath läuft.
    Das heist, du mußt diesen Pfad mit angeben.

    Wenn sich das Bild z.B. innerhalb eines Div mit dem Text-Inhalt "bla blubber usw." befindet geht folgendes:

    [autoit]

    $sSrc = _FFXPath("//div[starts-with(.,'bla blub')]//img", "src")

    [/autoit]
  • Okey, vielen Dank :) Das erklärt schon einiges^^ Auch, warum ich Beispiele mit @src gefunden habe und welche mit src ;D...

    Code
    </tr><tr> <th valign="middle" height="25" align="center">           <br> 
    Schau hier <br> <img border="0" src="design/bilder/hal.gif" width="75" height="75"><br> 
    </th>


    Wie wäre das dann dafür?...

    Müsste dann ja:

    [autoit]

    $sSrc = _FFXPath("//th/br[starts-with('Schau hier')]//img", "src")

    [/autoit]


    Das geht nicht,... Ich suche ein th, mit einem br drin, dass mit "Schau hier" anfängt und suche nach diesem Punkt das erste Bild und nach dem Source dieses...!?

    Warum ist das falsch :)?


    LG

  • Hallo,

    mehrere Fehler drin:

    1) <br> ist inhaltslos, also gibt es auch keinen Text den man suchen könnte, also gleich th nehmen, aber:
    2) starts-with ist schon wörtlich zu nehmen - der Inhalt von th beginnt nämlich mit

    Code
    "           <br>"


    3) der erste Parameter von starts-with fehlt, nämlich was denn überhaupt damit beginnen soll.
    Bei dem Ausdruck:
    starts-with(.,'searchstring')
    bezieht sich der Punkt auf das "aktuelle" Element, also bei//th[...] eben auf th

    Lösung:

    [autoit]

    $src = _FFXpath("//th[contains(.,'Schau hier')]//img/@src")

    [/autoit]
  • Wow... Nun habe ich es richtig verstanden ;D *gg* Danke...
    Die Funktion ist echt umfangreich/kompliziert^^ :p Aber super^^

    Eine kleine Frage noch diesbezüglich...
    Was ist vorteilhafter/schneller? XPather-Suchvorschlag nehmen oder den selber so "erarbeiten"?
    XPather sucht im Prinzip das gleiche, nur, dass er ja den Befehl wesentlich mehr einschränkt, also mit //html/... anfängt... Was sehr lang wird...

    So kurz gehalten bin ich gefeiter vor Veränderungen, richtig? :D Aber angeblich soll XPather so gut mit diesem Fehl kombinierbar sein :D Was hat das dann für Vorteile?!


    LG :)

  • Stimmt das ist "etwas" umfangreicher. Xpath ist schließlich eine komplette Sprache zum Abfragen von XML-Strukturen.

    Am besten mal die Links in der Dokumentation "überfliegen" oder die hier ansehen:
    http://www.w3.org/TR/xpath (angeblich soll FF zwar Xpath 2.0 eingebaut haben - funktioniert aber anscheinend nicht ... )
    http://de.selfhtml.org/xml/darstellung/xpathsyntax.htm
    http://www.zvon.org/xxl/XPathTutor…r/examples.html

    Der Xpather-Vorschlag ist eine gute Grundlage, wenn man sehr komplizierte Strukturen hat, also z.B. sehr verschachtelte DIVs die nur Aufgrund von Texten, Klassen oder Ähnlichem zu unterscheiden sind.
    Wenn man allerdings den kompletten xpath übernimmt läuft man Gefahr, das bei der kleinsten Änderung auf dieser Seite die Abfrage nicht mehr funktionert. Darum würde ich den Vorschlag von XPather als Grundlage nehmen und solange kürzen, bis kein eindeutiges Ergebnis mehr erscheint - die Ausdrücke lassen sich in XPather direkt testen.
    Normalerweise sind die Strukturen einer Seite meist so einfach, daß man XPather eh nur noch zum "Testen" braucht.

    Auch würde ich die Abfragen von hinten her "aufzäumen".
    Wenn z.B. ein img die id=*bild0815" hat, dann brauch ich nicht mehr als //img[@id='0815'] - da eine ID (normalerweise) eindeutig ist, braucht es keine weiteren Angaben.
    Oder ich habe nur eine Tabelle auf der Seite, bei der ich aus der zweiten Reihe die zweite Spalte den Text haben möchte:
    //tr[2]//td[2]
    mehr braucht es dann da nicht.

  • Super Informationen^^ Habe mich schon etwas rein gelesen ;)...

    Ist es eig. sinnvoll alle HTMLRead()-Funktionen dadurch zu ersetzen? Mit StringBetween und HTMLRead() erreiche ich ja das Gleiche... So bin ich bisher immer vor gegangen, aber XPath SOLLTE schneller arbeiten?! :D

    LG

  • Ganz klar ja.
    HTMLRead ist eigentlich ein Relikt aus den allerersten Versionen, wo ich noch eine Ähnlichkeit der Funktionen zur IE.au3 beibehalten wollte - mittlerweile ziemlich überflüssig ...

    * Erstens ist der Befehl relativ laaaangsam - da nimmt man leichter gleich INetGetSource oder ähnliches.
    * Änderungen per AJAX bekommt man gar nicht erst mit, wenn man den Quellcode ausliest - per Xpath hingegen ist das jederzeit möglich
    * Es ist per xpath viel eleganter und sicherer Abzufragen, als den Quellcode mit den String-Funktionen zu zerlegen.
    * Bei den Rückgaben die per Array erfolgen, spart man sich zig Schleifen in AutoIt.
    * Viele Funktionen (rechnen usw.) kann man auch gleich per XPath erledigen, da erspart man sich es viele Werte abzufragen und diese dann weiter zu verarbeiten
    * und da man auch Werte setzen kann und nicht nur welche Abfragen, wäre ein "ankreuzen" sämtlicher Checkboxen mit XPath einfach:

    [autoit]

    _FFXpath("//input[@type='checkbox']", "checked=true", 6)

    [/autoit]


    schneller gehts ja wohl nicht mehr ...
    * ... :D

  • xD... Das war eig. nicht als "Interview" gedacht und ich wollte dich fragen, ob ihr den Guide hier auch möchtet Oo... Ich will das für mich lernen und arbeite nebenbei auch an einem Guide...

    Wenn du das nicht willst, lösche ich das Zitat von dir heraus... Oo Tut mir leid, wenn das falsch rüber kommt -.-...

    Ich fand nur, dass deine Antworten so hervorragend sind, dass ich die nicht umschreiben sollte, sondern mit Quellenangabe auf dich besser zitiere...

    Bisher gibt es ja noch keinen richtigen Guide für deine fantastische UDF... Nur für IE.au3, von der sich die FF.au3 qualitativ doch sehr abhebt...

    Ich wollte eig. fragen, wie es sein kann, dass "[object XPCNativeWrapper [object Attr]]" als Ergebnis in einem Array kommt, wenn ich

    [autoit]

    $b = _FFXPath( "//a[contains(.,'hier')]/@href", "", 7)

    [/autoit]


    eingebe... Ist mir jetzt schön öfters passiert, wenn ich mit der "7" arbeiten wollte... XPather zeigt den Link als korrekt an...


    Ich hoffe, du bist mir jetzt nicht böse, weil ich dich als Referenz dort zitiert habe... Ich mache damit ja kein Geld oder sonstiges... :(


    LG

  • Nun mit keine Werbung machen, bezog sich auf unsere Forenregeln hier, sonst entsteht gleich wieder eine Diskussion um das Wort B**.

    Meine Antworten kannst Du gerne drin lassen.

    Ein Tutorial dazu ist natürlich jederzeit willkommen :)

    Probier doch mal:

    [autoit]

    $b = _FFXPath( "//a[contains(.,'hier')]", "href", 7)

    [/autoit]


    ob es damit auch noch passiert.

    Nein natürlich nicht :)

  • Ich dachte, die beiden machen keinen Unterschied xD... *arghs*
    Das erklärt einiges... Kann ich mein Script gleich wieder optimieren^^...

    Immer dieses Wort mit "B" :D Ich habe auf der Seite alles gefunden, was ich brauche, um zu Lernen... Ich wusste von keiner anderen etwas ;)... Weiss nicht mehr, wie ich drauf kam. Und da gehts nicht nur um "B", da lernt man auch vieles^^...

    Aber hier bist du natürlich der absolute Pluspunkt, denn die FF.au3 ist noch nicht so publik und daher hatte ich mich hier angemeldet^^

    Und ich denke, dass so ein Tutorial dir entgegen kommt, gut, dass du nicht böse bist xD Wollte es erst auch hier in den Threat posten, aber dann dachte ich auch an Fremdwerbung und wollte dir nachher oder morgen ne PN schreiben, ob ichs hier auch posten soll, auch, wenns kein "Exclusiv-Tut" ist :)


    Ohne deine Erläuterungen hier, hätte ich _FFXPath nie richtig verstanden xD...!

    Ich poste es gerne auch hier :D Die FF.au3 sollte auf jeden Fall mehr publiziert werden^^
    Hast du es dir angeschaut und für ">okey" befunden? :)

  • Eigentlich sollte es keinen Unterschied machen, wie ich schon sagte "probier mal" ...

    :)

    Publizieren ist so eine Sache - da denke ich mir manchmal - blos nicht, die Fragen allein im englischen Forum per PN, oder falls ich mal wieder aus Versehen ICQ anmache, arten in einen Vollzeit Job aus :D

    XPath ist ja auch keine exklusive Sache der FF.au3, es wird halt benutzt was der Browser an praktischen Dingen so hergibt.

    Ob ich da guten Gewissens ok sagen weis ich nicht - ich kann ja die Hälfte nicht lesen ohne mich dort vorher anzumelden :D

  • *haha* Alles klar ;D Ich poste es einfach mal...


    Ja, dass du gelöchert wirst, denke ich mir... Habe dich dort schon gesehen^^ Und dabei bleibste noch so freundlich xD Uiuiu :D

    Wie kommst du nur trotzdem dazu, alles weiterzuentwickeln*lach*...^^


    Naja, bevor das im Spam ausartet... Ich werds ma posten und vielleicht ist es ja sogar gut, es wird übersetzt, ins engl. Forum gestellt und nimmt dir Arbeit ab xD...

    Bis zu meiner nächsten Frage(die hoffe ich, nicht so alsbald auftaucht xD...)

    LG