我的计划是能够使用Bs4获取_AntiCsrfToken。
我在代码中写的是
token = soup.find('input', {'name':'_AntiCsrfToken'})['value'])
print(token)
但它给我一个错误说
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'
我完全不理解我是否做得对。我认为我做得对,但也许我需要先从form-id找到它,而不是直接进入隐藏状态?
答案 0 :(得分:1)
我不确定错误在哪里,但我已经制作了一个小的html文件并将其放在我的服务器上,我没有问题复制和粘贴你的代码..
唯一明显的区别(如果你还没有)是我正在使用请求将html解析为BS4
我想也许这是一个解析问题。
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)
返回:
5435434354353453545
你也不需要
{'name':'_AntiCsrfToken'}
这样:
token = soup.find('input')['value']
会工作
答案 1 :(得分:0)
也许尝试使用CSS selectors?
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)
输出:5435434354353453545