python - Analysieren Sie HTML-Formulare mit lxml.html mit xpath-Syntax
Frage
Hier ist das Formular.Dieselbe exakte Form erscheint zweimal in der Quelle.
<form method="POST" action="/login/?tok=sess">
<input type="text" id="usern" name="username" value="" placeholder="Username"/>
<input type="password" id="passw" name="password" placeholder="Password"/>
<input type="hidden" name="ses_token" value="token"/>
<input id="login" type="submit" name="login" value="Log"/>
</form>
Ich erhalte das Attribut "Aktion" mit diesem py-Code
import lxml.html
tree = lxml.html.fromstring(pagesource)
print tree.xpath('//action')
raw_input()
Da es zwei Formulare gibt, werden beide Attribute gedruckt
['/login/?session=sess', '/login/?session=sess']
Wie kann ich es dazu bringen, nur einen zu drucken?Ich brauche nur einen, da sie genau die gleiche Form haben.
Ich habe auch eine zweite Frage
wie kann ich den Wert des Tokens ermitteln?Ich spreche über diese Linie:
<input type="hidden" name="ses_token" value="token"/>
Ich versuche ähnlichen Code,
import lxml.html
tree = lxml.html.fromstring(pagesource)
print tree.xpath('//value')
raw_input()
Da jedoch mehr als ein Attribut mit dem Namen value , wird es ausgedruckt
['', 'token', 'Log In', '', 'token', 'Log In'] # or something close to that
Wie kann ich nur den Token bekommen?Und nur einer?
Gibt es einen besseren Weg, dies zu tun?
Lösung
Verwenden find()
statt xpath()
, da find()
gibt nur die erste Übereinstimmung zurück.
Hier ist ein Beispiel, das auf dem von Ihnen angegebenen Code basiert:
import lxml.html
pagesource = """<form method="POST" action="/login/?session=sess">
<input type="text" id="usern" name="username" value="" placeholder="Username"/>
<input type="password" id="passw" name="password" placeholder="Password"/>
<input type="hidden" name="ses_token" value="token"/>
<input id="login" type="submit" name="login" value="Log In"/>
</form>
<form method="POST" action="/login/?session=sess">
<input type="text" id="usern" name="username" value="" placeholder="Username"/>
<input type="password" id="passw" name="password" placeholder="Password"/>
<input type="hidden" name="ses_token" value="token"/>
<input id="login" type="submit" name="login" value="Log In"/>
</form>
"""
tree = lxml.html.fromstring(pagesource)
form = tree.find('.//form')
print "Action:", form.action
print "Token:", form.find('.//input[@name="ses_token"]').value
Abdrucken:
Action: /login/?session=sess
Token: token
Hoffe das hilft.