下面给出了我尝试从中提取信息的行示例。
[02/Jan/2015:08:07:32] "GET /click?article_id=162&user_id=5475 HTTP/1.1" 200 4352
[02/Jan/2015:08:08:43] "GET /click?article_id=139&user_id=19550 HTTP/1.1" 200 3078
[02/Jan/2015:08:09:01] "GET /click?article_id=87&user_id=9408 HTTP/1.1" 200 2005
[02/Jan/2015:08:09:18] "GET /click?article_id=175&user_id=9408 HTTP/1.1" 200 3467
我尝试了几种方法。其中之一是
with open('C:/Users/.../access_log/access.log', 'r') as read:
for line in read:
if "click?" in line:
article_id = line.split('article_id=')[1]
user_id = line.split('user_id=')[1]
article.write(article_id)
user.write(user_id)
我需要提取date
、article_id
、author_id
和最后两组数字。通过使用上面的代码,我的输出看起来像这样
对于 user_id 文件,输出如下所示
5475 HTTP/1.1" 200 4352
这里 5475 是我需要的 id,但该行的其余部分都带有它。同样,对于 article_id
文件,输出如下
162&user_id=5475 HTTP/1.1" 200 4352
这里 162 是我需要的值,但我再次得到了该值的其余行。
我尝试的第二种方法是这样的
for line in read:
article_id = re.match('.*article_id=(\d+)', line)
user_id = re.match('.*user_id=(\d+)', line)
if article_id and article_id.lastindex > 0:
ids.write(article_id.group(1))
但是我得到了这样的输出
1621398717554254614225905016411314518885592112332
我无法在 Excel 中执行此操作,因为 Excel 需要处理的数据点太多,并且所有文件都无法正确加载。另外,我需要确保当我从每一行提取数据点(date
、article_id
、author_id
,...)时,每个数据点都与同一行的其他数据点相对应,以便我可以查看是否有缺失值。
本质上有没有一种方法可以改变这个
[02/Jan/2015:08:07:32] "GET /click?article_id=162&user_id=5475 HTTP/1.1" 200 4352
[02/Jan/2015:08:08:43] "GET /click?article_id=139&user_id=19550 HTTP/1.1" 200 3078
[02/Jan/2015:08:09:01] "GET /click?article_id=87&user_id=9408 HTTP/1.1" 200 2005
[02/Jan/2015:08:09:18] "GET /click?article_id=175&user_id=9408 HTTP/1.1" 200 3467
进入此
Date Article_id user_id Response_code Content size
02/Jan/2015:08:07:32 162 5475 200 4352
02/Jan/2015:08:08:43 139 19950 200 3078
最佳答案
您可以使用这个简单的正则表达式来分割行:
re.split(r' ".*?=|&.*?=| .*?" ', line)
输出:
['[02/Jan/2015:08:07:32]', '162', '5475', '200 4352']
您还可以使用findall
:
re.findall(r'\[(.*?)\].*?(\d+).*?(\d+).*?(\d+)\s(\d+)', line)
输出:
[('02/Jan/2015:08:07:32', '162', '5475', '200', '4352')]
您可以将 re.findall
分配给变量并使用对元素的简单访问,例如:
data = re.findall(r'\[(.*?)\].*?(\d+).*?(\d+).*?(\d+)\s(\d+)', line)
print data[0][0]
02/Jan/2015:08:07:32
注意:如果缺少任何值,您会看到它,但我的解决方案不会向您显示具体缺少哪个值。
关于python - 如何从 Web 服务器日志文件中提取数据并解析请求行部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35371816/