打印包含“word”的行 Python

5
我想仅打印下面这段输出中包含“Server”的行:
Date: Sun, 16 Dec 2012 20:07:44 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=da8d52b67e5c7522:FF=0:TM=1355688464:LM=1355688464:S=CrK5vV-qb3UgWUM1; expires=Tue, 16-Dec-2014 20:07:44 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=nICkwXDM6H7TNQfHbo06FbvZhO61bzNmtOn4HA71ukaVDSgywlBjBkAR-gXCpMNo1TlYym-eYMUlMkCHVpj7bDRwiHT6jkr7z4dMrApDuTk_HuTrZrkoctKlS7lXjz9a; expires=Mon, 17-Jun-2013 20:07:44 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Connection: close

这些信息是从一个名为websiteheaders的列表中获取的。我有下面一段代码,让我非常疯狂,因为它没有正常工作...

for line in websiteheaders:
    if "Server" in line:
        print line

现在,上面的代码打印出与我帖子开头描述的完全相同的文本块。我不知道为什么会这样...
正如我所说,我只想打印包含“服务器”一行的内容,如果可能的话,不使用正则表达式。如果不可能,就使用正则表达式。
请帮忙,谢谢!
编辑:到目前为止,我完整的代码已经贴在这里:http://pastebin.com/sYuZyvX9 编辑2:为了完整起见,在hosts.txt中当前有1个名为“google.com”的主机。
更新
我的代码实际上运行得很好,但是我其他代码的一个错误确保将放入列表websiteheaders中的数据变成了1个大字符串,而不是多个条目。在上面的代码中,它当然会找到“服务器”并打印整个条目,而在我的情况下,这是完整的(大)字符串。
对我来说,使用
websiteheaders.extend(headers.splitlines())
而不是
websiteheaders.append(headers)
就可以解决问题了。非常感谢。

请展示您在哪里创建网站标题栏... - Joran Beasley
如果在for line in websiteheaders:循环之前打印print len(websiteheaders),你会得到什么?实际上,print repr(websiteheaders)会给出什么结果?(您可以将输出编辑到您的问题中。) - DSM
@DSM 实际上它会输出1。 - bryanvan
1
@bryanvan:那就是问题所在了。你的websiteheaders是一个列表,但它的第一个元素是一个长字符串。因此,由于Server在该字符串中,它会通过并打印出来。请使用websiteheaders.extend(headers.splitlines())代替websiteheaders.append(headers),这样你就有了一个包含每行的列表。 - DSM
@DSM 谢谢,这确实是正确的答案。我一直以为append是正确的方法。 - bryanvan
2个回答

10

请问websiteheaders是被分割为每行的列表吗?因为如果它是一个字符串,你应该使用:

for line in websiteheaders.splitlines():
    if "Server" in line:
        print line

另外一个好的提示是:我建议在遇到这种问题时添加一些 print 语句。如果你添加了像下面这样的内容:

else:
    print 'WRONG LINE:', line

你可能已经注意到了,这个循环并不是按行循环,而是按字符循环。

更新

我无法看出你的代码有什么问题。这是我得到的结果:

In [3]: websiteheaders
Out[3]: 
['Date: Sun, 16 Dec 2012 20:07:44 GMT',
 'Expires: -1',
 'Cache-Control: private, max-age=0',
 'Content-Type: text/html; charset=ISO-8859-1',
 'Set-Cookie: PREF=ID=da8d52b67e5c7522:FF=0:TM=1355688464:LM=1355688464:S=CrK5vV-qb3UgWUM1; expires=Tue, 16-Dec-2014 20:07:44 GMT; path=/; domain=.google.com',
 'Set-Cookie: NID=67=nICkwXDM6H7TNQfHbo06FbvZhO61bzNmtOn4HA71ukaVDSgywlBjBkAR-gXCpMNo1TlYym-eYMUlMkCHVpj7bDRwiHT6jkr7z4dMrApDuTk_HuTrZrkoctKlS7lXjz9a; expires=Mon, 17-Jun-2013 20:07:44 GMT; path=/; domain=.google.com; HttpOnly',
 'P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."',
 'Server: gws',
 'X-XSS-Protection: 1; mode=block',
 'X-Frame-Options: SAMEORIGIN',
 'Connection: close"']

In [4]: for line in websiteheaders:
   ...:     if 'Server' in line:
   ...:         print line
   ...:         
Server: gws

1
+1 虽然我建议使用 splitlines,除非您确定了行尾编码... - Joran Beasley
我可以将列表转换为字符串,例如:text = str(websiteheaders),并实现上面的代码片段,但这样它只会打印完整的字符串... - bryanvan
我已经将我的代码贴到了原始帖子中。我非常好奇可能出了什么问题!到目前为止,谢谢。 - bryanvan
@bryanvan 在循环之前添加 print websiteheaders 并更新你的问题,附上你的列表。 - Niclas Nilsson
太棒了!在调试时,很多打印语句都会有帮助。 - Niclas Nilsson
显示剩余3条评论

2
for single_line in websiteheaders.splitlines():
    if `Server` in single_line:
        print single_line

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接