【发布时间】:2016-12-01 16:27:24
【问题描述】:
在我的一个脚本中,我使用 urllib2 和 BeautifulSoup 来解析 HTML 页面并读取 <script> 标记。
这就是我得到的:
<script>
var x_data = {
logged: logged,
lengthcarrousel: 2,
products : [
{
"serial" : "106541823"
...
</script>
我的目标是读取 x_data 变量中的 JSON,但我不知道如何正确执行。
我想:
- 转换为字符串并将第一个字符删除到 { 和最后一个相同的 }
- 将正则表达式与“{.*}”之类的内容一起使用并获取第一组
- 还有别的吗?
我不知道这些是否有效,是否还有其他方法可以很好地做到这一点。
您认为一种方法比另一种方法更可取吗?任何我可能不知道的方法?
提前感谢您的任何建议。
编辑:
根据建议,我得到了 Regexp 解决方案,但尽管使用了 re.MULTILINE ,但我无法在多行中搜索:
string1 = '<script>
var x_data = {
logged: logged,
lengthcarrousel: 2,
products : [
{
"serial" : "106541823"}
]
};
</script>'
p = re.compile(r'\{.*\};',re.MULTILINE);
m = p.search(string1)
if m:
print m.group(0)
else:
print "Error !"
我总是收到“错误!”。
EDIT2:
适用于re.DOTALL。
【问题讨论】:
-
取决于输入的变化方式。如果它总是
var x_data = ...,你可以用正则表达式替换掉锚定到字符串开头的那个位。您的解决方案可能介于简单到嵌入 JS 解析器一样复杂。 -
您好,它永远是
var x_data = ...。谢谢,我现在正在编写正则表达式解决方案。 -
@JohnMath 您不应该使用多行匹配。只需做一个锚定到字符串开头的匹配,你不需要在字符串中到处搜索。
标签: regex parsing beautifulsoup