beautifulsoup 4 + python:string返回'None'

时间:2013-12-23 20:39:17

标签: python parsing html-parsing beautifulsoup

我正在尝试使用BeautifulSoup4和Python 2.7.6解析一些html,但字符串返回“None”。我正在尝试解析的HTML是:

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

我的python片段是:

 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

我最终试图让第一行变成一个变量,只是说“2个房间”,而第三行变成另一个变量只是说“USD 0”。

2 个答案:

答案 0 :(得分:3)

.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'

答案 1 :(得分: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