如何通过BeautifulSoup获取HTML标签的非属性内容及解析script标签中的window.WIZ_global_data为Python字典
这里你说的“非属性项”应该是指标签包含的文本内容或者子节点内容吧?BeautifulSoup提供了几种实用方法来获取这些内容:
获取标签内的纯文本:用
.text或者.get_text()方法就行,后者更灵活,能指定子标签文本的分隔符,还能自动去除首尾空格:# 示例:获取<p>标签的文本内容 paragraph = soup.find('p') plain_text = paragraph.text # 更干净的处理方式,自动去空格并合并子标签文本 clean_text = paragraph.get_text(strip=True, separator=' ')获取标签内的所有子节点(含标签和文本):可以用
.contents拿到子节点列表,或者用.children迭代器逐个遍历:# 遍历div标签的所有子节点 div_node = soup.find('div') for child in div_node.children: print(child)获取标签内的完整HTML结构:如果需要保留标签格式,直接把节点转成字符串,或者用
.prettify()输出格式化后的HTML:# 获取标签内的完整HTML代码 inner_html = str(div_node) # 格式化后的美观版本 formatted_html = div_node.prettify()
先明确一点:window.WIZ_global_data不是script标签的属性,它是script标签内部定义的JavaScript全局变量,属于标签的文本内容部分。
要把它转成Python字典访问,用字符串处理+JSON解析就能搞定,非常Pythonic:
步骤1:获取script标签的文本内容
你已经知道用soup.head.script.text获取,这一步没问题:
script_text = soup.head.script.text
步骤2:提取字典格式的字符串
我们需要去掉开头的window.WIZ_global_data = 和末尾的;,这里推荐用正则表达式,比字符串分割更可靠,能避免文本中其他干扰内容:
import re # 匹配window.WIZ_global_data后面的字典内容,支持换行 match = re.search(r'window\.WIZ_global_data = ({.*?});', script_text, re.DOTALL) if match: data_str = match.group(1)
re.DOTALL参数让.能匹配换行符,确保即使字典内容换行也能完整捕获。
步骤3:转为Python字典
这个JavaScript对象的格式完全符合JSON规范(键值都用双引号),直接用json.loads()转换即可:
import json wiz_data = json.loads(data_str)
步骤4:像普通字典一样访问
现在你就可以随意操作里面的内容了:
# 示例:获取FdrFJe对应的值 print(wiz_data['FdrFJe']) # 访问嵌套的nQyAE字典 print(wiz_data['nQyAE']['WBBR0d'])
如果遇到JavaScript对象里有单引号等不符合JSON的情况,可能需要先做替换,但你提供的例子格式很标准,上面的代码直接就能正常工作。
内容的提问来源于stack exchange,提问作者hovedguy

