我必须刮一个网站,这需要一个登录令牌。稍后将通过JS替换该值。
document.getElementById('token').value='aa5fedc5decbba3318deab92ffdfbd55d9a2c09ec81a464351ea449dc726ddd5';以上代码出现在</html>标记之后的源代码中。就像这样:
</body>
</html>
<script>
document.getElementById('token').value='aa5fedc5decbba3318deab92ffdfbd55d9a2c09ec81a464351ea449dc726ddd5';
</script>我必须复制这个值并通过http请求将其发布到URL以获得请求的接受。
但我无法得到这个价值。当我通过python库发送请求时,</html>标记后的代码是不可见的。
我的python代码在这里:
import requests
from bs4 import BeautifulSoup
session_requests = requests.session()
html = session_requests.get("http://lms.uaf.edu.pk/login/index.php")
html = html.text
soup = BeautifulSoup(html, "lxml")
print(soup)如何通过python获得登录令牌?
发布于 2021-03-14 15:06:52
以下代码成功地从您的网站获得登录令牌:
import requests
session_requests = requests.session()
html = session_requests.get("http://lms.uaf.edu.pk/login/index.php")
html = html.text
a = html.split("document.getElementById(\'token\').value=\'")[1]
b = a.split("'")[0]发布于 2021-03-14 15:16:31
您的代码不能工作的原因是,BeautifulSoup在</html>之后跳过任何html代码(基本上关闭文档),因此它只解析<html>标记中的所有内容,并且由于替换登录令牌的<script>标记是在关闭的</html>标记之后出现的,所以BeautifulSoup不会解析它,因此无法得到它。在浏览器中(我在FireFox上测试了它),在将关闭的</html>标记移动到文档正文后,所有内容都会被移到文档正文中,这就是为什么在浏览器中查看站点时正确显示登录令牌的原因。为此,您应该将BeautifulSoup放在一边,只需使用普通Python (可读版本):
import requests
html = requests.get('http://lms.uaf.edu.pk/login/index.php').text # get the html
token_begin = html.find("document.getElementById('token').value='") + len("document.getElementById('token').value='") # find the start of the login token
token_end = html[token_begin:].find("'") # find the end of the login token
token = html[token_begin:token_end]发布于 2021-03-14 21:02:14
我会直接从response.text中选择一个正则表达式,但是,值得知道的是,您可以通过包装一个外部的body标记来保存该内容,至少可以使用我遇到的所有html解析器。不提倡这种方法,尽管在某些语言中,它对于获取头部中的数据非常有用,否则,当输入DOM文档的body.innerHTML时,这些数据就会被剥离。
import requests
from bs4 import BeautifulSoup as bs
r = requests.get('http://lms.uaf.edu.pk/login/index.php')
soup = bs('<body>' + r.text + '</body>', 'lxml')
print(soup.select('script')[-1].string.split("'")[-2])https://stackoverflow.com/questions/66625245
复制相似问题