Seite 1 von 1

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

Verfasst: Mittwoch 20. Oktober 2010, 13:33
von Thyrix
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

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

Verfasst: Mittwoch 20. Oktober 2010, 15:12
von 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>``.

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

Verfasst: Donnerstag 21. Oktober 2010, 15:29
von Thyrix
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.

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

Verfasst: Freitag 22. Oktober 2010, 12:19
von Thyrix
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

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

Verfasst: Freitag 22. Oktober 2010, 12:26
von Xynon1
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 ?

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

Verfasst: Freitag 22. Oktober 2010, 12:33
von Thyrix
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 :|

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

Verfasst: Freitag 22. Oktober 2010, 12:51
von 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?

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

Verfasst: Freitag 22. Oktober 2010, 13:03
von Xynon1
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

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

Verfasst: Freitag 22. Oktober 2010, 13:15
von Thyrix
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.

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

Verfasst: Freitag 22. Oktober 2010, 13:26
von Xynon1
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.

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

Verfasst: Freitag 22. Oktober 2010, 13:36
von Thyrix
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.

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

Verfasst: Freitag 22. Oktober 2010, 13:53
von Thyrix
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?

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

Verfasst: Freitag 22. Oktober 2010, 14:48
von 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.

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

Verfasst: Freitag 22. Oktober 2010, 15:00
von Thyrix
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 ...

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

Verfasst: Freitag 22. Oktober 2010, 16:00
von 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>

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

Verfasst: Montag 25. Oktober 2010, 13:52
von Thyrix
Aaah super, vielen Dank :) :idea: