【问题标题】:Get javascript variable with python使用python获取javascript变量
【发布时间】:2019-04-19 20:59:27
【问题描述】:

在这里敲我的头..

我正在尝试使用以声明 var Listdata = 开头并以 }; 结尾的正则表达式解析 javascript 变量“ListData”的全部内容的 html 源代码。

我找到了一个类似的解决方案:

Fetch data of variables inside script tag in Python or Content added from js

但我无法让它匹配整个正则表达式。

代码:

# Need the ListData object
pat = re.compile('var ListData = (.*?);')

string = """QuickLaunchMenu == null) QuickLaunchMenu = $create(UI.AspMenu, 
null, null, null, $get('QuickLaunchMenu')); } ExecuteOrDelayUntilScriptLoaded(QuickLaunchMenu, 'Core.js');
var ListData = { "Row" : 
[{
"ID": "159",
"PermMask": "0x1b03cc312ef",
"FSObjType": "0",
"ContentType": "Item"
};
moretext;
moretext"""

#Returns NoneType instead of match object
print(type(pat.search(string)))

不确定这里出了什么问题。任何帮助将不胜感激。

【问题讨论】:

  • 你应该使用右手定界符,试试'(?m)var ListData = (.*?)};$'
  • @WiktorStribiżew 这也不匹配。
  • 可以,有多行,用'(?sm)var ListData = (.*?)};$'
  • @WiktorStribiżew 是的,这行得通。如果你想写一个正式的答案,我会接受。我将不得不阅读 (?sm) 的作用。谢谢!
  • 请注意,此模式仅依赖于尾随 }; 出现在行尾这一事实。真的是这样吗? .*? 匹配任何 0+ 字符,尽可能少,直到行尾的 first };。 请将这些详细信息添加到问题中,因为这是一个重要的限制。

标签: python regex python-3.x


【解决方案1】:

在您的正则表达式中,(.*?); 部分匹配除换行符以外的任何 0+ 字符,直到第一个 ;。如果在线上没有;,你将没有匹配。

根据您预期的匹配以行尾的第一个 }; 结尾这一事实,您可以使用

'(?sm)var ListData = (.*?)};$'

这里,

  • (?sm) - 启用re.S(它使. 匹配任何字符)和re.M(这使得$ 匹配行尾,而不仅仅是整个字符串并使^ 匹配行首位置)模式
  • var ListData =
  • (.*?) - 第 1 组:任何 0+ 个字符,尽可能少,直到第一个...
  • };$ - }; 在行尾

【讨论】:

  • Python 有更好的方式来表示多行匹配:pat = re.compile(r"var ListData = (.*?})?", re.MULTILINE)。在这种情况下,您还需要re.DOTALL,因为点可以匹配换行符,所以pat = re.compile(r"var ListData = (.*?})?", re.MULTILINE | re.DOTALL)
  • @AdamSmith 您的r"var ListData = (.*?})?" 不需要re.M 标志,因为它既没有$ 也没有^。 re.S 等于 re.DOTALL,我更喜欢使用内联变体,它们更短更通用。
  • 它们更短,更通用(因为我提出的语法不能不那么通用,因为它只适用于 Python),但我觉得内联标志有点混水一种已经迅速演变为 gobbledygook 的语言。 YMMV :)
  • @AdamSmith 我也更喜欢 Python 中的这种方式,因为经常有 stackoverflow.com/questions/11958728 或 stackoverflow.com/questions/42581 之类的情况
  • 值得注意的是:将其定义为显式关键字参数是明确的。 re.compile(somepattern, flags=someflags)
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2020-02-10
  • 1970-01-01
相关资源
最近更新 更多