BeautifulSoup soup.prettify()给出了奇怪的输出

时间:2014-01-03 14:57:41

标签: python django beautifulsoup urllib2

我正在尝试解析一个网站,我将在稍后的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>'

3 个答案:

答案 0 :(得分:6)

以下是 为我工作的最小示例,包括您遇到问题的html片段。没有你的代码很难说,但我猜你在某处做了类似' '.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">
....

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这看起来就像你的XML带来了一个美丽的并不期待的编码。我的猜测是你的XML是UTF-16,而beautifulsoup正在读它为UTF-8。 Python提供.encode和.decode函数,用于在不同编码之间切换。像

这样的东西
myXmlStr.encode("utf-16").decode("utf-8")

如果问题是您的传入XML编码,可能会解决您的问题。我自己也很喜欢漂亮的汤,但快速的谷歌建议如果问题是输出的编码,那么美化会接受一个编码参数:

soup.prettify("utf-16")

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