python - 如何从 Web 服务器日志文件中提取数据并解析请求行部分?

标签 python text-files

下面给出了我尝试从中提取信息的行示例。

[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)

我需要提取datearticle_idauthor_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 需要处理的数据点太多,并且所有文件都无法正确加载。另外,我需要确保当我从每一行提取数据点(datearticle_idauthor_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/

相关文章:

python - 具有多个选项的 while 循环中的键盘输入

python - 字符串列表中字符串出现的双重列表理解

python - 如何从txt文件中删除特定行及其后面的n行?

java - 计算文本文件中从 A 点到 B 点的行数

python - 使用 IAM 角色使用 Python 连接到 Redshift

Python:返回列表不起作用

c++ - 读取包含矩阵 C++ 的文本文件

c - 从文本文件创建二维数组

java - 如何从文本文件中获取特定的行并在android中显示数组列表

python - 如何在 matplotlib 饼图中设置楔形边框?