我正在尝试使用BeautifulSoup4和Python 2.7.6解析一些html,但字符串返回“None”。我正在尝试解析的HTML是:
<div class="booker-booking">
2 rooms
·
USD 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”。
答案 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