【问题标题】:Trying to parse a specific value in a JS script尝试解析 JS 脚本中的特定值
【发布时间】:2018-10-09 07:48:59
【问题描述】:

我正在尝试抓取 POST 请求中所需的值。在 Chrome 上使用 Inspect Element 时可以多次找到该值,但由于 BS4 只查看源代码,我必须从该站点的 JS 脚本中抓取该值。

<script type ="text/javascript">        
    var isSRFlow = true;
    var isPpaOnSignIn =true;
    var simplifyRegFlowSuccess = false;
    var retUrl = "https&#x3a;&#x2f;&#x2f;www.ebay.com&#x2f;";
    var isFB = false;
    var isMobile = false;
    var langCode = "en-US";


    var emailAutoCompleteEnabled = true;

    var dfpContext = '{"enableTMXTagging":"true","slURL":"ebay","flashTagUpgrade":"0","enableFlashTagging":"false","tmxDfpUrl":"https://signin.ebay.com/t_n.html?suppressFlash\u003dtrue\u0026org_id\u003dusllpic0\u0026session_id\u003d57be07a71660ad4e16f42acffffc95e8","swfURL":"ebay","enableSLTagging":"false","swfObjectJSLibURL":"ebay","mid":"AQAAAWZGrHELAAUxNjY1N2JlMDdhNy5hZDRlMTZmLjQyYWNmLmZmZmM5NWU5Jp0dBAKw4k3h8WAm/g97vwVzjcA*","tmxSessionId":"57be07a71660ad4e16f42acffffc95e8","enableHTML5Tagging":"true","flashTagVersion":"1","dfpjsURL":"https://secureir.ebaystatic.com/f/0vk0rkyoky1ltm32dhy0hthnxyx.js"}';

我设法通过使用 r = requests.get('https://reg.ebay.com/reg/PartialReg')
soup = BeautifulSoup(r.text, 'lxml') scripts = soup.find_all('script') your_script = [script for script in scripts if 'tmxSessionId' in str(script)][0]

但是,我唯一需要的是“57be07a71660ad4e16f42acffffc95e8”,它们是“tmxSessionId”之后的数字。如何才能做到这一点?

我也试过这些:

scripts = soup.find_all('script')
your_script = [script for script in scripts if 'tmxSessionId' in str(script)][0]
new = your_script.find("tmxSessionId")
print(new)

以及使用“find_all”而不是“find”。我的一位朋友也建议拆分脚本,但我尝试过,发现它效果不佳。有什么想法吗?

P.S:使用基于浏览器的解决方案(例如 selenium 和 PhantomJS)并不是我想做的事情,因为我发现它缓慢且无效

编辑: 我使用我的旧代码从源代码中获取脚本,然后使用 Selçuk 建议的内容

scripts = soup.find_all('script')
your_script = [script for script in scripts if 'tmxSessionId' in str(script)][0]
script_tag = your_script
soup = BeautifulSoup(script_tag, 'lxml')
script = soup.find_all('script')[0]
data = re.findall("{.*?}", script.text)[0]

print(json.loads(data)['tmxSessionId'])

【问题讨论】:

    标签: python html beautifulsoup python-requests


    【解决方案1】:

    我不知道你的脚本内容的其余部分,所以我不得不关闭标签。但它会起作用。

    import requests
    from bs4 import BeautifulSoup
    import re
    import json
    
    script_tag = """
    <script type ="text/javascript">        
        var isSRFlow = true;
        var isPpaOnSignIn =true;
        var simplifyRegFlowSuccess = false;
        var retUrl = "https&#x3a;&#x2f;&#x2f;www.ebay.com&#x2f;";
        var isFB = false;
        var isMobile = false;
        var langCode = "en-US";
    
    
        var emailAutoCompleteEnabled = true;
    
        var dfpContext = '{"enableTMXTagging":"true","slURL":"ebay","flashTagUpgrade":"0","enableFlashTagging":"false","tmxDfpUrl":"https://signin.ebay.com/t_n.html?suppressFlash\u003dtrue\u0026org_id\u003dusllpic0\u0026session_id\u003d57be07a71660ad4e16f42acffffc95e8","swfURL":"ebay","enableSLTagging":"false","swfObjectJSLibURL":"ebay","mid":"AQAAAWZGrHELAAUxNjY1N2JlMDdhNy5hZDRlMTZmLjQyYWNmLmZmZmM5NWU5Jp0dBAKw4k3h8WAm/g97vwVzjcA*","tmxSessionId":"57be07a71660ad4e16f42acffffc95e8","enableHTML5Tagging":"true","flashTagVersion":"1","dfpjsURL":"https://secureir.ebaystatic.com/f/0vk0rkyoky1ltm32dhy0hthnxyx.js"}';
    </script>
    """
    
    soup = BeautifulSoup(script_tag, 'lxml')
    script = soup.find_all('script')[0]
    data = re.findall("{.*?}", script.text)[0]
    
    print(json.loads(data)['tmxSessionId'])
    

    输出将是

    57be07a71660ad4e16f42acffffc95e8
    

    【讨论】:

    • 所以首先你得到了脚本(我可以使用我发布的代码得到它)并将其全部作为变量,然后你使用 BS4 来解析该变量的内容?然后将内容作为 JSON 获取并打印出来?
    • 是的。就这些。也许你可以改进正则表达式并直接获得你想要的价值而不需要 json 解析
    • 我刚试了一下,我得到一个“NoneType object is not callable”错误。我使用了必须从站点获取脚本的原始代码,然后使用您的代码尝试获取 sessionId。我将“your_script”(来自我的原始代码)作为“script_tag”输入。我这样做的原因是因为 SessionID 每次都会改变
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多