如何在Python 3.x中逐行打印网页

时间:2016-10-04 01:09:37

标签: python python-3.x web

我想要做的就是打印一个简单网站的HTML文本。当我尝试打印时,我会以原始格式使用换行符(\n)而不是实际的新行来获取下面的文本。

这是我的代码:

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

并且令人惊讶地没有做任何事情。 它只是将它打印成一行。

请帮帮我。我很惊讶我没有发现任何对我有用的东西。即使在论坛上,也没有任何效果。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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>

答案 2 :(得分: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">