使用 beautifulsoup 从 <script> 中提取数据

我正在尝试使用 Python 和 Beautifulsoup 抓取一些数据。我知道如何从脚本标签中获取文本。[ ] 之间的数据是有效的 json。


<script>

    dataLayer = 

[  

  {  

  "p":{  

         "t":"text1",

         "lng":"text2",

         "vurl":"text3"

       },

  "c":{  },

  "u":{  },

  "d":{  },

  "a":{  }

  }

]

</script>

我已经阅读了这个回复,它几乎完成了我想要的: 用 BeautifulSoup 提取 <Script 的内容


这是我的代码:


import urllib.request

from bs4 import BeautifulSoup

import json


url = "www.example.com"

html = urllib.request.urlopen(url)

soup = BeautifulSoup(html, "html.parser")

raw_data = soup.find("script")

理想情况下,我会这样做:


json_dict = json.loads(raw_data)

并通过字典访问数据。但这不起作用,因为


"<script> dataLayer =" 

在有效的 json 之前,最后是 script 标签。我试过将 raw_data 修剪为字符串,如下所示:


raw_data[20:]

但这不起作用,因为汤对象不是字符串。


如何让 raw_data 变量只包含块引号 [ ] 之间的文本?


编辑:这似乎有效。它避免了正则表达式并解决了尾随字符的问题。感谢您的建议。


url = "www.example.com"

html = urllib.request.urlopen(url)

soup = BeautifulSoup(html, "html.parser")


# get the script tag data and convert soup into a string

data = str(soup.find("script"))


# cut the <script> tag and some other things from the beginning and end to get valid JSON

cut = data[27:-13]


# load the data as a json dictionary

jsoned = json.loads(cut)


Qyouu
浏览 873回答 2
2回答

慕尼黑8549860

用于.text获取<script>标签内的内容然后替换dataLayer =raw_data = soup.find("script")raw_data = raw_data.text.replace('dataLayer =', '')json_dict = json.loads(raw_data)

紫衣仙女

>>> import re>>> soup.find_all(re.compile("\[(.*?)\]"))你会用正则表达式做到这一点您将不得不创建一个只接受 [] 之间的文本的正则表达式规范
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python