【问题标题】:Python - Parsing a specific value from a URL within a linePython - 从一行中的 URL 解析特定值
【发布时间】:2013-02-26 13:53:56
【问题描述】:

我已经设法让我的脚本根据行中的内容打印出一行文本:

if "cvename" in line:       
    CVE = list_of_line[4:5]     
    print "The CVE number is ", ' '.join(CVE)       
    print " "
    CVEfile.write("CVE-" + str(CVE) + '\n')

打印出来的:

['http://cve.mitre.org/cgi-bin/cvename.cgi?name=1999-0016][Xref']

但我想要的只是值'1999-0016'

我假设可以使用正则表达式来执行此操作,但我没有太多使用它们的经验。我注意到的是,我要提取的值总是以年份开头,因为它是一个 CVE 编号

【问题讨论】:

    标签: python regex parsing


    【解决方案1】:

    在使用正则表达式之前,请始终尝试使用更具体的方法。你需要解析一个网址吗?使用urlparse

    import urlparse
    
    u = 'http://cve.mitre.org/cgi-bin/cvename.cgi?name=1999-0016'
    
    q = urlparse.urlparse(u).query
    values = urlparse.parse_qs(q).get('name')
    if values is not None:
        print values[0]
        # prints '1999-0016'
    

    【讨论】:

      【解决方案2】:

      您需要进一步修正解析算法,但只获取值部分:

      >>> from urllib2 import urlparse
      >>> urlparse.parse_qs(urlparse.urlparse(s).query)['name'][0]
      '1999-0016][Xref'
      

      一旦你修复了这个位CVE = list_of_line[4:5],上面会给你预期的结果。

      【讨论】:

        【解决方案3】:

        在这种情况下你可以使用正则表达式,是的:

        re.compile(r'name=(\d{4}-\d{4})')
        

        将匹配以name= 开头的任何文本,后跟两个 4 位数字。分组允许您提取该数字:

        >>> import re
        >>> cve_param = re.compile(r'name=(\d{4}-\d{4})')
        >>> cve_param.search('http://cve.mitre.org/cgi-bin/cvename.cgi?name=1999-0016][Xref').group(1)
        '1999-0016'
        

        我确实注意到通常 CVE 编号以文本CVE- 为前缀;匹配这两种形式的正则表达式是:

        re.compile(r'name=(?:CVE-)?(\d{4}-\d{4})')
        

        使用正则表达式可以让您从全文中挑选出此类 URL。另一方面,如果您使用的是正确的 HTML 解析器,我建议您改为解析组成部分的 URL。

        【讨论】:

        • URL 存储在一个名为 CVE 的变量中,所以我尝试了这个:cve_param.search(CVE).group(1)。但我得到以下结果: <_sre.sre_pattern object at> 而不是数字
        • 你为什么要分割你的list_of_line列表? list_of_line[4] 将是单个字符串,而不是具有单个元素的列表。如果您不需要列表,请不要使用列表。 :-)
        • 在答案中查看我的示例; re.compile() 返回一个已编译的模式对象;您拥有的_sre.SRE_Pattern 参考。您也可以直接使用re.search(r'name=(\d{4}-\d{4})', CVE).search() 返回None(未找到),或者返回一个匹配对象,您可以在该对象上调用.group(1) 来获取匹配的第一组。请阅读re module documentation
        猜你喜欢
        • 1970-01-01
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多