【问题标题】:How to get JavaScript variables from a script tag using Python and Beautifulsoup如何使用 Python 和 Beautifulsoup 从脚本标签中获取 JavaScript 变量
【发布时间】:2019-01-17 13:13:25
【问题描述】:

我想使用 beautifulsoup 和 python 从变量 meta 返回“id”值。这可能吗?此外,我不知道如何找到包含元变量的特定“脚本”标签,因为它没有唯一标识符,以及网站上的许多其他“脚本”标签。我也在使用 selenium,所以我可以理解任何答案。

<script>
    var meta = "variants":[{"id":12443604615241,"price":14000}, 
    {"id":12443604648009,"price":14000}]
</script>

【问题讨论】:

  • 到目前为止你在用 python 做什么?
  • @FrankDiGiacomoKnarFTHUNDER 用&lt;script&gt;标签的父节点更新HTML

标签: python selenium web-scraping beautifulsoup


【解决方案1】:

如果你使用 selenium,则无需解析 html 来获取 js 变量,只需使用 selenum webdriver.execute_script() 将其获取到 python:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://whatever.com/')
meta = driver.execute_script('return meta')

就是这样,meta 现在保存了 js 变量,并且它保持了它的类型

【讨论】:

  • 谢谢,不知道对我来说这么简单。
  • 这比预期的效果更好 - “保持其类型”是轻描淡写的。捕获的变量,在我的例子中是一个 js 数组,可以直接用作 Python 列表!
【解决方案2】:

您可以使用内置的 rejson 模块来提取 Javascript 变量:

from bs4 import BeautifulSoup
import re
import json
from pprint import pprint

data = '''
<html>
<body>

<script>
    var meta = "variants":[{"id":12443604615241,"price":14000},
    {"id":12443604648009,"price":14000}]
</script>

</body>
'''

soup = BeautifulSoup(data, 'lxml')
json_string = re.search(r'meta\s*=\s*(.*?}])\s*\n', str(soup.find('script')), flags=re.DOTALL)

json_data = json.loads('{' + json_string[1] + '}')

pprint(json_data)

打印出来:

{'variants': [{'id': 12443604615241, 'price': 14000},
              {'id': 12443604648009, 'price': 14000}]}

【讨论】:

  • 这似乎是正确的想法,但我收到一个错误:说明“TypeError: 'NoneType' object is not subscriptable,” 请记住,网站上还有大约 50 个其他脚本标签没有任何唯一标识符有时,所以我想我需要找到这个独特的,其中包含变量 meta。不知道是不是这个问题,谢谢
  • @FrankDiGiacomoKnarFTHUNDER 我不知道您拥有的 html 代码的结构,因此在不知道的情况下很难帮助您。我只能说选择您想要的脚本并使用正确的正则表达式来提取变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2019-07-26
  • 2018-06-10
  • 2021-07-22
  • 2020-01-15
  • 2014-05-22
相关资源
最近更新 更多