2013-12-23 53 views
1

我想用BeautifulSoup4和Python 2.7.6解析一些html,但字符串返回「None」。我試圖解析HTML是:beautifulsoup 4 + python:string返回'None'

<div class="booker-booking"> 
    2&nbsp;rooms 
    &#0183; 
    USD&nbsp;0 
    <!-- Commission: USD --> 
</div> 

蟒蛇我的片段是:

data = soup.find('div', class_='booker-booking').string 

我也嘗試以下兩種:

data = soup.find('div', class_='booker-booking').text 
data = soup.find('div', class_='booker-booking').contents[0] 

其中兩個返回:

u'\n\t\t2\xa0rooms \n\t\t\xb7\n\t\tUSD\xa00\n\t\t\n 

我最終試了一下ng將第一行寫入一個只說「2 Rooms」的變量,將第三行寫入另一個只說「USD 0」的變量。

+0

有應該是一個'_ '類' 之後?此外,我沒有看到任何'沒有'在這裏返回... – Totem

+0

是的。這就是beautifulsoup如何識別DIV類,而不是python認爲它是一個python類。 – crookedleaf

+0

soup.find怎麼樣(「div」,{「class」:「booker-booking」})? – Totem

回答

2

.string返回None,因爲文本節點不是唯一的子節點(有註釋)。

from bs4 import BeautifulSoup, Comment 

soup = BeautifulSoup(html) 
div = soup.find('div', 'booker-booking') 
# remove comments 
text = " ".join(div.find_all(text=lambda t: not isinstance(t, Comment))) 
# -> u'\n 2\xa0rooms\n \xb7\n USD\xa00\n  \n' 

要刪除的Unicode空白:

text = " ".join(text.split()) 
# -> u'2 rooms \xb7 USD 0' 
print text 
# -> 2 rooms · USD 0 

要獲得最終的變量:

var1, var2 = [s.strip() for s in text.split(u"\xb7")] 
# -> u'2 rooms', u'USD 0' 
0

完成data = soup.find('div', class_='booker-booking').text之後,您已經從HTML中提取了所需的數據。現在你只需要它來獲得「2間」和「0美元,第一步是通過線可能分割數據格式:

import string 
lines = string.split(data, '\n') 

哪位能給[u'', u'\t\t2\xa0rooms ', u'\t\t\xb7', u'\t\tUSD\xa00', u'\t\t', u'']

現在,你需要擺脫空白的,未逸出的HTML字符,並刪除不需要的數據線:

import HTMLParser 
h = HTMLParser.HTMLParser() 
formatted_lines = [string.strip(h.unescape(line)) for line in lines if len(line) > 3] 

你將留下的數據你想要的:

print formatted_lines[0] 
#2 rooms 
print formatted_lines[1] 
#USD 0