PyQuery .each() - Aus html wird Integer/Index

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Thyrix
User
Beiträge: 13
Registriert: Freitag 6. August 2010, 14:25

Hallo zusammen,

Ich habe wieder ein Problem bei der Wertübergabe des .each() aus PyQuery.
Erstmal der Code:

Code: Alles auswählen


from pyquery import PyQuery as pq
from lxml import etree

d=pq("""<html>
<head></head>
<body>

<p>
<a>A</a>
</p>

<p>
<a>B</a>
</p>

<p>
<a>C</a>
</p>

<a>D</a>

<p>
<a>E</a>
</p>

</body>
</html> """)


def pr(self):

    print self


d('p > a').each(pr)


In der Zeile d('p > a').each(pr) sollte eigtl. jeweils ein Link an die Funktion pr übergeben werden.
In der Python Shell funktioniert das soweit, die Links werden ausgegeben, jedoch nicht auf dem Server.
Hier wird statt des jeweiligen Links von der Funktion ein Integer Wert ausgegeben, scheinbar ein Index.
Zu dem Beispiel wäre die Ausgabe also:

Code: Alles auswählen

0
1
2
3

anstatt wie in der Shell und wie es eigtl sein sollte:

Code: Alles auswählen

<a>A</a>
<a>B</a>
<a>C</a>
<a>E</a>
Die benutzte Python Version auf dem Server sowie in der Shell ist 2.5.

Hat jemand eine Ahnung, woran das hängen könnte oder einen Link zu einer guten Erklärung des Pyquery .each()?
Ich habe leider auch keinen blassen Schimmer, wie man so ein Phänomen nennt, was mir die Suche nicht erleichtert hat :S

Viele Grüße und vielen Dank schonmal,

Thyrix
BlackJack

@Thyrix: Also bei Deinem Beispiel bekomme ich den Index ausgegeben und das hätte ich jetzt auch so erwartet, denn das ist beim Vorbild `jQuery` genau so. Warum nennst Du das erste Argument einer Funktion `self`? Kann es sein, dass Du uns hier Quelltext zeigst, der nicht dem entspricht bei dem Du tatsächlich ein Problem hast!?

Wenn man ein zweites Argument hinzufügt -- den bei *dem* wird dann auch tatsächlich das Element übergeben, kommt man übrigens immer noch nicht zu Deiner angeblichen Ausgabe, denn diese Objekte sehen dann ungefähr so aus, wenn man sie einfach mit ``print`` ausgibt: ``<Element a at 0xb794848c>``.
Thyrix
User
Beiträge: 13
Registriert: Freitag 6. August 2010, 14:25

Jop ist wieder vereinfachter Code, allerdings ausprobiert und kam zum gleichen Ergebnis wie das Original. Ich poste morgen von der Arbeit aus mal Screenshots, sonst glaubts mir ja doch keiner :D
Ja schön wärs, wenn ich das Ergebnis hätte was du da postest und es tatsächlich so funktionieren würde wie in Jquery, dann hätte ich ein Problem weniger :( Wie gesagt, morgen Screenshots.

Bei meinem letzten Pyquery .each() Problem hatte ich ja auch versucht mehrere Argumente zu übergeben, was aber egal wie ichs probiert hab nicht funktioniert hat. Muss man hier speziell irgendwas beachten, was von "normalen" Argumentübergaben an Funktionen abweicht? Wenn da jemand ein Beispiel hätte wäre ich sehr dankbar.
Thyrix
User
Beiträge: 13
Registriert: Freitag 6. August 2010, 14:25

Also wie gesagt, hier im ersten Bild, wie es auf dem Server aussieht. Ergebnis (im schwarzen Puttyfeldchen): Index

Bild


und hier in der Python Shell, Ergebnis: Die Links, wie ich sie gerne hätte.

Bild


:K
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

mh, ich kenn den Putty Terminal leider nicht, könnte es aber sein das der einfach die tags "schluckt" ?
Weil der Terminal diese irgendwie verarbeiten will ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Thyrix
User
Beiträge: 13
Registriert: Freitag 6. August 2010, 14:25

Hmm das wäre eine ziemlich gemeine Möglichkeit... Müsste er sich dann aber nicht auch an den restlichen Tags im Testhtml verschlucken?
Ich meine, er gibt ja immerhin die richtige Anzahl an Links wieder :|
BlackJack

@Thyrix: Das auf dem Server ist schon richtig so. Das ist jedenfalls genau das was man bei dem Quelltext erwarten sollte, denn so funktioniert `each()` wie gesagt auch in jQuery. Keine Ahnung warum Du bei Dir lokal in IDLE etwas anderes bekommst. Welche Versionen von PQuery hast Du denn jeweils installiert?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Also ich habe es jetzt mal bei mir in der IDLE getestet - dort geht es.

Edit: Python/IDLE 2.6.6 pyquery-0.6.1 und lxml-2.2.2
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Thyrix
User
Beiträge: 13
Registriert: Freitag 6. August 2010, 14:25

Oha, daran kanns natürlich liegen... Lokal hab ich pyquery 0.5 und lxml 2.2.2. Das auf dem Server hab ich gerade gesucht,
aber nicht gefunden. Da bin ich ohne unseren Admin gerade etwas aufgeschmissen... Muss ich wohl bis nächste Woche warten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

sie doch nach wo python liegt, entweder ist es in lib/site-package oder in dem verzeichnis wo du den script ausführst.

Zumindest höchstwarscheinlich.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Thyrix
User
Beiträge: 13
Registriert: Freitag 6. August 2010, 14:25

Aaah ok danke, war in site-package. Und ist natürlich tatsächlich Version 0.6.1... Ich pack das mal eben bei mir lokal drauf und bin gespannt was rauskommt.
Thyrix
User
Beiträge: 13
Registriert: Freitag 6. August 2010, 14:25

Super, funktioniert :) Immerhin hab ich nun lokal das gleiche Ergebnis wie auf dem Server.
Bleibt noch die Frage, wie ich nun hier aus dem jeweils übergebenen Argument einen anderen Wert heraushole, als den Index.
Blackjack hatte ja was gesagt, ich müsste noch ein Argument übergeben, allerdings hab ich wie oben gesagt keinen Dunst
wie ich das hier mache. Each() nimmt ja genau 2 Argumente, von denen eins die aufzurufende Funktion ist, und das andere ist der automatisch an diese Funktion übergebene Wert aus d('p > a'). Alles andere gab bisher Fehlermeldungen.
Jemand eine Ahnung / ein Beispiel wie das hier funktioniert?
BlackJack

@Thyrix: Es geht nicht um die Anzahl der Argumente von `each()` sondern wieviele Argumente Du in der Funktion entgegennimmst, die Du `each()` übergibst. Also in Deinem Fall `pr()`. Wenn die Funktion zwei Argumente erwartet bekommst Du dort als zweites Argument das Element.
Thyrix
User
Beiträge: 13
Registriert: Freitag 6. August 2010, 14:25

Ach so rum war das gemeint :)

Ich bekomme jetzt

Code: Alles auswählen

<Element a at 1529f90>
<Element a at 1952210>
<Element a at 1952360>
<Element a at 1952120>
beim print als Ergebnis.

Dachte eigentlich, da könnte ich jetzt wie auf Listen oder ähnliches zugreifen, aber
da hab ich mich wohl vertan :S
Kannst du mir nun noch sagen, wie ich damit umgehe? Z.B. wie ich den Wert ausgeben oder das ganze so einrichten kann, dass ich es manipulieren kann ...
BlackJack

@Thyrix: Das sind `lxml`-Element-Objekte, also die `ElementTree`-API (siehe Standardbibliothek) plus die zusätzlichen Möglichkeiten die `lxml` bietet.

Code: Alles auswählen

In [46]: a
Out[46]: <Element a at 0x8542eb4>

In [47]: a.tag
Out[47]: 'a'

In [48]: a.text
Out[48]: 'A'

In [49]: etree.tostring(a)
Out[49]: '<a>A</a>\n'

In [50]: a.getparent()
Out[50]: <Element p at 0x854e194>
Thyrix
User
Beiträge: 13
Registriert: Freitag 6. August 2010, 14:25

Aaah super, vielen Dank :) :idea:
Antworten