0

我目前正处于 Python3 的学习过程中,我正在为一些数据抓取一个站点,效果很好,但是在打印出 p 标签时,我无法按预期工作。

import urllib
import lxml
from urllib import request
from bs4 import BeautifulSoup



data = urllib.request.urlopen('www.site.com').read()
soup = BeautifulSoup(data, 'lxml')
stat = soup.find('div', {'style' : 'padding-left: 10px';})
dialog = stat.findChildren('p')

for child in dialog:
    childtext = child.get_text()
    #have tried child.string aswell (exactly the same result)
    childlist.append(childtext.encode('utf-8', 'ignore')
    #Have tried with str(childtext.encode('utf-8', 'ignore'))

print (childlist)

一切正常,但打印是“字节”

b'This is a ptag.string'
b'\xc2\xa0 (probably &nbsp'
b'this is anotherone'

ascii 编码的真实示例文本:

b"Announcementb'Firefox users may encounter browser warnings encountering SSL SHA-1 certificates"

请注意,Announcement 是 p,其余是 'strong' 在 ap 标签下。

使用 utf-8 编码的相同样本

b"Announcement\xc2\xa0\xe2\x80\x93\xc2\xa0b'Firefox users may encounter browser warnings encountering SSL SHA-1 "

我希望得到:

"Announcement"
(newline / new item in list)
"Firefox users may encounter browser warnings encountering SSL SHA-1 certificates"

如您所见,不正确的字符在“ascii”中被删除,但有些字符会 破坏一些换行符,我还没有弄清楚如何正确打印,而且 b 仍然在那里!

我真的不知道如何删除 b 并正确编码或解码。我已经尝试了所有可以搜索到的“解决方案”。

HTML 内容 = utf-8

我最不想在处理之前更改完整的数据,因为它会扰乱我的其他工作,我认为没有必要。

美化不起作用。

有什么建议么?

4

1 回答 1

0

首先,您正在获取表单的输出,b'stuff'因为您正在调用.encode(),它返回一个字节对象。如果要打印字符串以供阅读,请将它们保留为字符串!

作为一种猜测,我假设您希望从 HTML 中很好地打印字符串,就像在浏览器中看到的那样。为此,您需要解码 HTML 字符串编码,如此 SO answer中所述,这对于 Python 3.5 意味着:

import html
html.unescape(childtext)

除其他外,这会将 HTML 字符串中的任何序列转换为'\xa0'字符,这些字符打印为空格。但是,如果您想在这些字符上换行,尽管 字面意思是“不间断空格”,您必须在打印之前用实际空格替换这些字符,例如使用x.replace('\xa0', ' ').

于 2016-01-21T06:30:31.130 回答