【问题标题】:Search string with re module in html page在 html 页面中使用 re 模块搜索字符串
【发布时间】:2014-09-06 16:21:59
【问题描述】:

我有带有 javascript 的 html 页面 html中有一些js代码:

<script type="text/javascript">
    var viewAllLimiter = 0;
</script>

如何找到 viewAllLimiter 并通过 re.search 获取其价值?

我试过了:

#hh2 - opened page with urllib2
re.search('var viewAllLimite = "(\w)"', hh2)

我需要这样的输出:

var viewAllLimiter = 0;

或其他任何我知道的我看到 viewAllLimiter 参数的值

【问题讨论】:

    标签: python regex full-text-search web-scraping


    【解决方案1】:

    一种方法是使用re.findall 方法和组。这将返回您的组作为成员的列表。此外,如果您想将大于 9 的数字与您的正则表达式匹配,您需要在 \w 之后添加一个“+”。此外,如果您确定该值将始终是一个数字,最好使用 \d+。

    re.findall( r'(viewAllLimiter =) (\w+)', txt )
    

    这将返回

    [('viewAllLimiter =', '0')]
    

    对于你的例子,但也会返回

    [('viewAllLimiter =', '9924')]
    

    如果该值是一个更大的数字。注意列表中的元组。这是因为您为每个模式匹配获得一个元组,并且元组中的每个项目都是您的组之一。使用正则表达式时要记住的最后一件事,使用raw strings(前导引号前的r)可以省去很多麻烦。

    要匹配更通用的变量类,您可以使用以下正则表达式,

    re.findall( r"""\s*(CATEGORY_ID)\s*=\s*((?:'|")?\w+(?:'|")?)""", txt )
    

    只要您将要搜索的变量名称放在正则表达式的开头,它就会捕获引号中的任何内容(或不捕获)。请注意,这将返回引号和值,例如 [('SKU', '"GRP05133"')]。如果你只想要这个值,你可以让第二组紧靠\w+ 部分。

    re.findall( r"""\s*(CATEGORY_ID)\s*=\s*(?:'|")?(\w+)(?:'|")?""", txt )
    

    如果我们分解这个正则表达式,它会说,

    """
    \s*       # zero or more white spaces
    (xxx)     # the variable you're looking for
    \s*       # zero or more white spaces
    =         # an equal sign
    \s*       # zero or more white space
    (?:'|")?  # zero or one ' or " but non-capturing (i.e. don't store in group output)
    (\w+)     # the value of the variable
    (?:'|")?  # zero or one single quote OR zero or one double quote
    """
    

    【讨论】:

    • 但如果我使用你的模式,它不适用于其他 js 变量
    • 您能否扩展您的问题以显示这一点或提出一个新问题?
    • 这里有一些东西可以帮助您入门。为了匹配引号而没有结束我用于正则表达式的字符串,我使用三引号来包含我的正则表达式 r"""\s*=\s*(['"]?\w+['"]?)""" 这表示匹配零个或多个空格,然后是“=”,然后是零个或多个空格,然后是可以用单引号或双引号
    【解决方案2】:

    您可以使用命名组:

    m=re.search(r"var viewAllLimiter =(?P<myFancyName>\w);", s)
    

    然后,要访问该值(在您的情况下为 0),您可以这样做

    m.groupdict()["myFancyName"]
    

    要访问 viewAllLimitergroupdict() 的值,会返回一个字典,其中包含 reg-exp 中的所有命名组。

    【讨论】:

    • 如果你想找到它的所有出现,你必须使用findall而不是search
    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多