首页 > 解决方案 > 如何使用 bs4 访问脚本标签中的内容

问题描述

我是 python 新手,我正在尝试使用漂亮的汤在具有 dataLayer 的页面上找到一个脚本标签,然后检索 postNo 的值并打印它。

  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>

<!-- Data Layer - Begin -->
<script>
  dataLayer = [
    {
      'country': 'UnitedKingdom',
      'site': 'Blog',
      'postNo': '34',
      'pageType': 'Home',
      'pageType2': 'Blog',
      'pageType3': 'Top Tips'
    }
  ];
</script>
<!-- Data Layer - End -->
  </head>

任何帮助或指示将不胜感激。谢谢

标签: python-3.xbeautifulsoup

解决方案


import requests
import bs4
import json




html = '''
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>

<!-- Data Layer - Begin -->
<script>
  dataLayer = [
    {
      'country': 'UnitedKingdom',
      'site': 'Blog',
      'postNo': '34',
      'pageType': 'Home',
      'pageType2': 'Blog',
      'pageType3': 'Top Tips'
    }
  ];
</script>
<!-- Data Layer - End -->
  </head>'''


soup = bs4.BeautifulSoup(html, 'html.parser')

scripts = soup.find_all('script')
for script in scripts:
    if 'dataLayer = ' in script.text:

        jsonStr = script.text.strip()
        jsonStr = jsonStr.split('[')[1].strip()
        jsonStr = jsonStr.split(']')[0].strip()
        jsonStr = jsonStr.replace("'", '"')

        jsonObj = json.loads(jsonStr)

print (jsonObj['postNo'])

输出:

print (jsonObj['postNo'])
34

推荐阅读