2013-12-23 3 views
1

Я пытаюсь разобрать некоторый html с BeautifulSoup4 и Python 2.7.6, но строка возвращает «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 

Я в конечном счете tryi ng, чтобы получить первую строку в переменной, просто говоря «2 комнаты», а третья строка - в другую переменную, просто говоря «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 комнаты» и «USD 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 
Смежные вопросы