如何用Python+BeautifulSoup提取<script>中jsessionid实现Webmail重定向
解决Mechanize登录Webmail后提取JS重定向中的JSESSIONID问题
看来你在用mechanize写Python脚本提取Webmail信息时,卡在了登录后的JS重定向环节——返回的页面只有一段跳转脚本,正则提取JSESSIONID还没成功,别着急,我来给你捋捋解决方案!
问题分析
你拿到的返回内容是一段JavaScript重定向代码,其中的jsessionid藏在window.self.location.replace的目标URL里。之前正则没成功,大概率是表达式没有覆盖JSESSIONID的所有字符规则(比如它包含大写字母、数字和点号),或者分组方式不对。
解决方案:两种提取方式任选
方式1:直接提取完整的重定向URL
这种方法更稳妥,不用手动拼接参数,直接把JS里的目标URL完整提取出来:
import mechanize import re import cookielib cj = cookielib.LWPCookieJar() br1 = mechanize.Browser() br1.set_handle_robots(False) br1.set_cookiejar(cj) br1.open("LOGIN URL") br1.select_form(nr=0) br1.form['username'] = mail_site br1.form['password'] = pw_site res1 = br1.submit() html = res1.read().decode('utf-8') # 解码为字符串,避免字节串匹配问题 # 提取完整的重定向URL url_pattern = r"window.self.location.replace\('(.*?)'\)" url_match = re.search(url_pattern, html) if url_match: full_redirect_url = url_match.group(1) print(f"提取到的重定向URL: {full_redirect_url}") # 用mechanize打开这个URL,继续后续流程 res2 = br1.open(full_redirect_url) # 处理目标页面内容 target_html = res2.read().decode('utf-8') print(target_html) else: print("未能找到重定向URL")
方式2:单独提取JSESSIONID再拼接URL
如果你只需要JSESSIONID,或者想自己构造URL,可以用这个方法:
# 接前面的登录代码... html = res1.read().decode('utf-8') # 提取JSESSIONID jsessionid_pattern = r'jsessionid=([A-Z0-9.]+)' jsessionid_match = re.search(jsessionid_pattern, html, re.IGNORECASE) if jsessionid_match: jsessionid = jsessionid_match.group(1) print(f"提取到的JSESSIONID: {jsessionid}") # 构造重定向URL redirect_url = f'/webmail/en_EN/continue.html;jsessionid={jsessionid}?MESSAGE=NO_COOKIE&DT=1&URL_VALID=welcome.html' res2 = br1.open(redirect_url) # 处理后续内容 else: print("未能提取到JSESSIONID")
关键注意点
- 解码字节串:
res1.read()返回的是字节串,记得用decode('utf-8')转成字符串,否则正则匹配可能失效。 - 正则匹配规则:JSESSIONID通常由大写字母、数字和点号组成,所以正则里用
[A-Z0-9.]+,加上re.IGNORECASE可以兼容小写的情况(如果有的话)。 - Mechanize的JS限制:Mechanize本身不支持执行JavaScript,所以这种JS重定向必须手动处理,没法让它自动跳转。
内容的提问来源于stack exchange,提问作者a.lejeune626
相关产品推荐
相关产品推荐

