2017-09-03 5 views
0

Mein Plan ist es, die _AntiCsrfToken mit Bs4 greifen zu können.Python Schöne Suppe - Eingabewert erhalten

Ich habe dieses HTML, wo mein HTML von enter image description here

kommt und was ich in den Code geschrieben ist

token = soup.find('input', {'name':'_AntiCsrfToken'})['value']) 
print(token) 

aber es gibt mir eine Fehlermeldung, dass

Traceback (most recent call last): 
    File "C:\Users\HelloWorld.py", line 67, in <module> 
    print(soup.find('input', {'name':'_AntiCsrfToken'})['value']) 
    File "C:\Python\lib\site-packages\bs4\element.py", line 1292, in find 
    l = self.find_all(name, attrs, recursive, text, 1, **kwargs) 
AttributeError: 'str' object has no attribute 'find_all' 

ich ganz verstehe nicht, ob ich es richtig gemacht habe oder nicht. Ich denke, dass ich es richtig gemacht habe, aber vielleicht muss ich es vorher bei der Formular-ID finden, anstatt direkt in das Versteckte zu gehen?

+0

es sieht aus wie Sie eine Methode auf 'soup' verwenden, die dann' self.find_all' nennt aber behauptet, dass 'self' ist eine Zeichenfolge, die aus dem üblichen sehr hoch ist, Haben Sie versucht, bs4 auf die neueste Version zu aktualisieren? –

+0

Hmm. Nun, ich weiß nicht, ob es möglich ist zu aktualisieren, aber ich habe '' 'pip install beautifulsoup4''' gemacht, aber es heißt, ich habe es bereits installiert, also nehme ich an, dass ich die neueste Version habe. Ich habe es auch vor ein paar Tagen installiert. – WeInThis

+0

versuchen Sie einfach ['pip install --upgrade beautifulsoup4'] (https://packaging.python.org/tutorials/installing-packages/#upgrading-packages), obwohl es vorschlagen sollte, wenn es ein verfügbares Update entdeckt. Ich werde einen Blick auf den Quellcode werfen, um zu sehen, ob ich herausfinden kann, was los ist –

Antwort

1

Ich bin nicht sicher, wo der Fehler für Sie liegt aber ich habe ein wenig HTML-Datei aus und legte es auf meinem Server und ich habe kein Problem, das Kopieren und Einfügen von Code ..

Der einzige merkliche Unterschied (wenn Sie haben es nicht getan) ist, dass ich Anfragen verwende, um den HTML zu BS4

zu analysieren Ich denke, es ist vielleicht ein Parsing-Problem.

HTML

<html> 

<form action="process"> 
<input type="hidden" name="_AntiCsrfToken" value="5435434354353453545"> 

</form> 
</html> 

Python:

from bs4 import BeautifulSoup as bs4 
import requests 

r = requests.get('http://maffaz.com/so.html') 
html_bytes = r.text 
soup = bs4(html_bytes, 'lxml') 
token = soup.find('input', {'name':'_AntiCsrfToken'})['value'] 
print(token) 

kehrt:

5435434354353453545 

Auch brauchen Sie nicht

{'name':'_AntiCsrfToken'} 

so:

token = soup.find('input')['value'] 

Arbeitet
+0

Ich habe bereits die neueste Version und ich habe immer noch das gleiche Problem. – WeInThis

+0

Können Sie mehr Code posten? Entweder ein MCVE hier oder der vollständige Code auf github/pastebin .. vorzugsweise ein MCVE – johnashu

0

versuchen Vielleicht CSS selectors mit?

from bs4 import BeautifulSoup 

html = """ 
<html> 
<input type="hidden" name="_AntiCsrfToken" value="5435434354353453545"> 
</html> 
""" 

soup = BeautifulSoup(html, 'lxml') 
csrf = soup.select_one('input[name=_AntiCsrfToken]')['value'] 
print(csrf) 

Ausgang: 5435434354353453545