我正在尝试解析一个网站,我将在稍后的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 " > 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 " > / t d > \n / t r > \n t r > \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 " > 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 " > / t d > \n / t r > \n / t a b l e > \n / c e n t e r > / d i v > \n \n p > &n b s p ; &n b s p ; &n b s p ; &n b s p ; / p > \n / b o d y > \n / h t m l >\n </p>\n </body>\n</html>'
答案 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')
更好地处理;这种情况例如是当文本内容中有未屏蔽的<
个字符(而不是<
)时。
答案 2 :(得分:0)
这看起来就像你的XML带来了一个美丽的并不期待的编码。我的猜测是你的XML是UTF-16,而beautifulsoup正在读它为UTF-8。 Python提供.encode和.decode函数,用于在不同编码之间切换。像
这样的东西myXmlStr.encode("utf-16").decode("utf-8")
如果问题是您的传入XML编码,可能会解决您的问题。我自己也很喜欢漂亮的汤,但快速的谷歌建议如果问题是输出的编码,那么美化会接受一个编码参数:
soup.prettify("utf-16")
如果没有更多信息,我无法给出更明确的答案 - 但希望这会为您指明一个有用的方向。