使用python从javascript获取相同的元素但不同的值

时间:2015-08-22 08:40:43

标签: javascript python python-2.7 beautifulsoup

这与我上一次question类似。

问题是整个脚本看起来像这样: - http://pastebin.com/1MyGGD9h

正如你可以看到' userId'元素重复。 python脚本获取第一个并忽略第二个结果。如何获取它们并分别使用它们的值。

我认为可以做的是一次获取一个元素并分别使用这些值。但是,我似乎无法让它发挥作用。

现在,为了获取脚本..我的代码如下所示: -

Import re

from bs4 import BeautifulSoup

page = """
<script type="text/javascript">
            var logged = true;
            var video_id = 59374;
            var item_type = 'official';

            var debug = false;
            var baseUrl = 'http://www.example.com';
            var base_url = 'http://www.example.com/';
            var assetsBaseUrl = 'http://www.example.com/assets';
            var apiBaseUrl = 'http://www.example.com/common';
            var playersData = [{"playerId":"showsPlayer","userId":true,"solution":"flash","playlist":[{"itemId":"5090","itemAK":"Movie"}]];
</script><script type="text/javascript" >
"""
soup = BeautifulSoup(page)

pattern = re.compile(r'"userId":"(.*?)"', re.MULTILINE | re.DOTALL)
script = soup.find("script", text=pattern)

print pattern.search(script.text).group(1)

现在,它显示&#34; true&#34;。但是,我想要两个价值观。那是...... TRUE和FALSE,形成两个元素。任何想法。?

1 个答案:

答案 0 :(得分:0)

您的问题示例中只有一个userid,但如果有两个findall,则应使用a,b = pattern.findall(script.text) ,搜索将在第一次匹配时停止:

html="""<script type="text/javascript">
        var logged = true;
        var video_id = 59374;
        var item_type = 'official';

        var debug = false;
        var baseUrl = 'http://www.example.com';
        var base_url = 'http://www.example.com/';
        var assetsBaseUrl = 'http://www.example.com/assets';
        var apiBaseUrl = 'http://www.example.com/common';
        var playersData =     [{"playerId":"showsPlayer","userId":true,"solution":"flash","userId":false    ,"playlist":[{"itemId":"5090","itemAK":"Movie"}]];
</script><script type="text/javascript" >"""


pattern = re.compile(r'"userId":(.*?),')


print pattern.findall(page)
['true', 'false']

您的正则表达式似乎也不正确,没有双引号值:

import CoreGraphics

enum Line {
    case    Horizontal(CGFloat)
    case    Vertical(CGFloat)
}

let min = Line.Horizontal(0.0)
let mid = Line.Horizontal(0.5)
let max = Line.Horizontal(1.0)

func doToLine(line: Line) -> CGFloat? {
    if case .Horizontal(let value) = line {
        return value
    }
    return .None
}

doToLine(min) // prints 0
doToLine(mid) // prints 0.5
doToLine(max) // prints 1