如何在Python 3.x中逐行打印网页
我只想打印简单网站的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
字符。如果我尝试使用代表\n
和print()
的新行自己复制原始文本,它会将\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')
它惊奇地没有做任何事。 它只是把它打印成一行。
请帮帮我。我很惊讶,我发现没有任何工作适合我。即使在论坛上,也没有任何工作。
一种方法是使用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)
为什么要经历所有这些麻烦,当一个人可以绕过它? – bjd2385
因为OP不想循环它。他想要一段被格式化的html代码,并在视觉上显示换行符。另外,4行代码几乎不麻烦。为什么要循环打印内容,在打印res.content时打印内容和已格式化的块? – reticentroot
您的字节字符串似乎在其中有硬编码\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>
你得到的不是文本而是字节。如果你想要文本解码它。
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">
'用于页行:打印(line.decode( 'UTF-8'))'或'打印(page.read()进行解码('UTF- 8'))' –