【问题标题】:BeautifulSoup soup.prettify() gives strange outputBeautifulSoup soup.prettify() 给出奇怪的输出
【发布时间】:2014-01-21 06:52:09
【问题描述】:

我正在尝试解析一个网站,稍后我将在我的 Django 项目中使用它。为此,我使用 urllib2 和 BeautifulSoup4。但是,我无法得到我想要的。 BeautifulSoup 对象的输出很奇怪。我尝试了不同的页面,它有效(输出正常)。我以为是页面的原因。然后,当我的朋友尝试做同样的事情时,他得到了正常的输出。我无法弄清楚问题。

这是我要解析的website。

这是命令“soup.prettify()”后奇怪输出的示例:

t   d       B   G   C   O   L   O   R   =   "   #   9   9   0   4   0   4   "       w   i   d   t   h   =   "   3   "   &gt;   i   m   g       S   R   C   =   "   1   p   .   g   i   f   "       A   L   T       B   O   R   D   E   R   =   "   0   "       h   e   i   g   h   t   =   "   1   "       w   i   d   t   h   =   "   3   "   &gt;   /   t   d   &gt;   \n           /   t   r   &gt;   \n           t   r   &gt;   \n                   t   d       c   o   l   s   p   a   n   =   "   3   "       B   G   C   O   L   O   R   =   "   #   9   9   0   4   0   4   "       w   i   d   t   h   =   "   6   0   0   "       h   e   i   g   h   t   =   "   3   "   &gt;   i   m   g       s   r   c   =   "   1   p   .   g   i   f   "       w   i   d   t   h   =   "   6   0   0   "   \n                   h   e   i   g   h   t   =   "   1   "   &gt;   /   t   d   &gt;   \n           /   t   r   &gt;   \n   /   t   a   b   l   e   &gt;   \n   /   c   e   n   t   e   r   &gt;   /   d   i   v   &gt;   \n   \n   p   &gt;   &amp;n   b   s   p   ;   &amp;n   b   s   p   ;   &amp;n   b   s   p   ;   &amp;n   b   s   p   ;   /   p   &gt;   \n   /   b   o   d   y   &gt;   \n   /   h   t   m   l   &gt;\n  </p>\n </body>\n</html>'

【问题讨论】:

  • 你能贴出你使用的代码吗?
  • 和@Hooked 写的差不多。这是我使用的: import urllib2 from bs4 import BeautifulSoup page = urllib2.open("kafemud.bilkent.edu.tr/monu_tr.html") soup = BeautifulSoup(page) print soup.prettify()

标签: python django beautifulsoup urllib2


【解决方案1】:

这是一个确实对我有用的最小示例,包括您遇到问题的 html 的 sn-p。没有你的代码很难说,但我猜你在某处做了类似' '.join(A.split()) 的事情。

import urllib2, bs4

url = "http://kafemud.bilkent.edu.tr/monu_tr.html"
req = urllib2.urlopen(url)
raw = req.read()
soup = bs4.BeautifulSoup(raw)

print soup.prettify().encode('utf-8')

给予:

....
<td bgcolor="#990404" width="3">
       <img alt="" border="0" src="1p.gif" width="3"/>
      </td>
      <td bgcolor="#FFFFFF" valign="TOP">
       <div align="left">
        <table align="left" border="0" cellpadding="10" cellspacing="0" valign="TOP" width="594">
         <tr>
          <td align="left" valign="top">
           <table align="left" border="0" cellpadding="0" cellspacing="0" class="icerik" width="574">
....

【讨论】:

  • 它在我的电脑上给出了同样奇怪的输出。
【解决方案2】:

可能您和您的朋友使用不同的解析器。 BeautifulSoup 将使用它认为“最佳”的解析器,因此出于速度原因(如果已安装)更喜欢lxml。如果使用最新版本的 Python(以及包含的解析器的最新版本),BeautifulSoup(text, 'html.parser') 可以更好地处理某些情况;就是这种情况,例如当文本内容中有未屏蔽的&amp;lt; 字符(而不是&amp;lt;)时。

【讨论】:

    【解决方案3】:

    看起来您的 XML 使用了 beautifulsoup 不期望的编码。我的猜测是您的 XML 是 UTF-16 格式,beautifulsoup 将其读取为 UTF-8。 Python 提供 .encode 和 .decode 函数用于在不同编码之间切换。像

    myXmlStr.encode("utf-16").decode("utf-8")
    

    如果问题是您传入的 XML 编码,可能会解决您的问题。我自己是美汤的新手,但一个快速的谷歌建议如果问题是输出的编码,prettify 接受一个编码参数:

    soup.prettify("utf-16")
    

    如果没有更多信息,我无法为您提供更清晰的答案 - 但希望这会为您指明一个有用的方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2020-10-06
      • 1970-01-01
      相关资源
      最近更新 更多