繁体   English   中英

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

[英]How can I print a webpage line by line in Python 3.x

我想要做的就是打印一个简单网站的 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字符。 如果我尝试使用表示为\\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')

令人惊讶的是它什么也没做。 它只是将其打印为一行。

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

一种方法是使用 python 请求模块。 您可以通过执行 pip install requests 来获取它(如果您不使用 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)

您的字节字符串中似乎有硬编码的\\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">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM