0

我正在尝试从 jb hifi 中提取 spcify 信息,这就是我所做的:

from BeautifulSoup import BeautifulSoup
import urllib2
import re



url="http://www.jbhifionline.com.au/support.aspx?post=1&results=10&source=all&bnSearch=Go!&q=ipod&submit=Go"

page=urllib2.urlopen(url)
soup = BeautifulSoup(page.read())
Item0=soup.findAll('td',{'class':'check_title'})[0]    
print (Item0.renderContents())

输出是:

Apple iPod Classic 160GB (Black) 
<span class="SKU">MC297ZP/A</span>

我想要的是:

Apple iPod Classic 160GB (Black)

我尝试使用 re 删除其他信息

 print(Item0.renderContents()).replace{^<span:,""} 

但它没有用

所以我的问题是如何删除无用的信息并获得“Apple ipod classic 160GB(黑色)”

4

1 回答 1

2

不要使用.renderContents(); 它充其量只是一个调试工具。

只要得到第一个孩子:

>>> Item0.contents[0]
u'Apple iPod Classic 160GB (Black)\xc2\xa0\r\n\t\t\t\t\t\t\t\t\t\t\t'
>>> Item0.contents[0].strip()
u'Apple iPod Classic 160GB (Black)\xc2'

看来 BeautifulSoup 并没有完全正确地猜出编码,因此不间断空格 (U+00a0) 以两个单独的字节而不是一个字节的形式出现。看起来 BeautifulSoup 猜错了:

>>> soup.originalEncoding
'iso-8859-1'

您可以使用响应标头强制编码;该服务器确实设置了字符集:

>>> page.info().getparam('charset')
'utf-8'
>>> page=urllib2.urlopen(url)
>>> soup = BeautifulSoup(page.read(), fromEncoding=page.info().getparam('charset'))
>>> Item0=soup.findAll('td',{'class':'check_title'})[0]
>>> Item0.contents[0].strip()
u'Apple iPod Classic 160GB (Black)'

fromEncoding参数告诉 BeautifulSoup 使用 UTF-8 而不是 Latin 1,现在不间断的空格被正确剥离。

于 2013-06-01T10:38:18.907 回答