2016-10-04 91 views
-1

我只想打印简单网站的HTML文本。当我尝试打印时,我使用换行符(\n)以原始格式显示下面的文本,而不是实际的新行。如何在Python 3.x中逐行打印网页

这是我的代码:

import urllib.request 

page = urllib.request.urlopen('http://www.york.ac.uk/teaching/cws/wws/webpage1.html', data = None) 
pageText = page.read() 
pageLines = page.readlines() 
print(pageLines) 
print(pageText) 

我已经试过各种其他的东西,发现一些东西。当我尝试索引pageText变量时,即使在将其转换为字符串后,它也找不到任何\n字符。如果我尝试使用代表\nprint()的新行自己复制原始文本,它会将\n字符转换为我想要的实际新行。问题是,我无法自己复制它而无法得到结果。

要告诉你我的意思是,这里有一些HTML片段:

原始文本:

b'<HMTL>\n<HEAD>\n<TITLE>webpage1</TITLE>\n</HEAD>\n<BODY BGCOLOR="FFFFFf" LINK="006666" ALINK="8B4513" VLINK="006666">\n 

我想要什么:

b'<HMTL> 
<HEAD> 
<TITLE>webpage1</TITLE> 
</HEAD> 
<BODY BGCOLOR='FFFFFf' LINK='006666' ALINK='8B4513' VLINK='006666'> 

我也用:

page = str(page) 
lines = page.split('\n') 

它惊奇地没有做任何事。 它只是把它打印成一行。

请帮帮我。我很惊讶,我发现没有任何工作适合我。即使在论坛上,也没有任何工作。

+1

'用于页行:打印(line.decode( 'UTF-8'))'或'打印(page.read()进行解码('UTF- 8'))' –

回答

0

一种方法是使用pythons请求模块。您可以通过执行pip安装请求来获取它(如果您未使用virtualenv,则可能必须使用sudo)。

import requests 

res = requests.get('http://www.york.ac.uk/teaching/cws/wws/webpage1.html') 
if res.status_code == 200: # check that the request went through 
    # print the entire html, should maintain internal newlines so that when it print to screen it isn't on a single line 
    print(res.content) 

    #if you want to split the html into lines, use the split command like below 
    #lines = res.content.split('\n') 
    #print(lines) 
+0

为什么要经历所有这些麻烦,当一个人可以绕过它? – bjd2385

+0

因为OP不想循环它。他想要一段被格式化的html代码,并在视觉上显示换行符。另外,4行代码几乎不麻烦。为什么要循环打印内容,在打印res.content时打印内容和已格式化的块? – reticentroot

0

您的字节字符串似乎在其中有硬编码\n

例如,最初不能分割值。

In [1]: s = b'<HMTL>\n<HEAD>\n' 

In [2]: s.split('\n') 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-2-e85dffa8b351> in <module>() 
----> 1 s.split('\n') 

TypeError: a bytes-like object is required, not 'str' 

所以,你str()它,但似乎并没有工作。

In [3]: str(s).split('\n') 
Out[3]: ["b'<HMTL>\\n<HEAD>\\n'"] 

但是,如果你逃脱新线它确实有点工作。

In [4]: str(s).split('\\n') 
Out[4]: ["b'<HMTL>", '<HEAD>', "'"] 

可以使用原始字符串拆就

In [5]: for line in str(s).split(r'\n'): 
    ...:  print(line) 
    ...: 
b'<HMTL> 
<HEAD> 
' 

或者,如果你不想领先b,则可以decode字节串入一个字符串对象,你可以再分裂。

In [9]: for line in s.decode("UTF-8").split('\n'): 
    ...:  print(line) 
    ...: 
<HMTL> 
<HEAD> 
0

你得到的不是文本而是字节。如果你想要文本解码它。

b = b'<HMTL>\n<HEAD>\n<TITLE>webpage1</TITLE>\n</HEAD>\n<BODY BGCOLOR="FFFFFf" LINK="006666" ALINK="8B4513" VLINK="006666">\n' 
s = b.decode() # might need to specify an encoding 
print(s) 

输出:

<HMTL> 
<HEAD> 
<TITLE>webpage1</TITLE> 
</HEAD> 
<BODY BGCOLOR="FFFFFf" LINK="006666" ALINK="8B4513" VLINK="006666">