Python - 从一行中的URL解析特定值

时间:2013-03-11 11:44:31

标签: python regex parsing

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

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编号

3 个答案:

答案 0 :(得分:2)

在使用正则表达式之前,始终尝试使用更具体的方法。你需要解析一个网址?使用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'

答案 1 :(得分:1)

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

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。

答案 2 :(得分:1)

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

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

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