【问题标题】:beautifulsoup 4 + python: string returns 'None'beautifulsoup 4 + python:字符串返回“无”
【发布时间】:2013-12-23 20:39:17
【问题描述】:

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

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

我拥有的python的sn-p是:

 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”的变量中。

【问题讨论】:

  • “class”后面应该有一个“_”吗?另外,我没有看到这里返回任何“无”...
  • 是的。这是 beautifulsoup 识别 DIV 类的方式,而不是 python 认为它是一个 python 类。
  • soup.find("div", {"class": "booker-booking"}) 怎么样?
  • 也返回“无”。
  • 但你说他们返回 u'\n\t\t2\xa0rooms \n\t\t\xb7\n\t\tUSD\xa00\n\t\t\n',其中是一个 unicode 字符串...

标签: python parsing html-parsing beautifulsoup


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在您完成data = soup.find('div', class_='booker-booking').text 之后,您已经从 HTML 中提取了所需的数据。现在您只需将其格式化为“2 Rooms”和“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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2019-08-08
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      相关资源
      最近更新 更多