提取 <div> 标签外的文本 BeautifulSoup

Extracting text outside of a <div> tag BeautifulSoup

所以我在练习抓取,我遇到了这样的事情:

<div class="profileDetail">
    <div class="profileLabel">Mobile : </div>
     021 427 399 
</div>

我需要 <div> 标签之外的数字:

我的代码是:

num = soup.find("div",{"class":"profileLabel"}).text

但它的输出是 Mobile : 只是 <div> 标签内的文本而不是标签外的文本。

那么我们如何提取 <div> 标签之外的文本呢?

尝试使用 soup.find("div",{"class":"profileLabel"}).next_sibling,这将获取下一个元素,它可以是 bs4.Tagbs4.NavigableString

bs4.NavigableString 是您在这种情况下想要得到的。

elem = soup.find("div",{"class":"profileLabel"}).next_sibling
print type(elem)

# Should return
bs4.element.NavigableString

示例:

In [4]: s = bs4.BeautifulSoup('<div> Hello </div>HiThere<p>next_items</p>', 'html5lib')

In [5]: s
Out[5]: <html><head></head><body><div> Hello </div>HiThere<p>next_items</p></body></html>

In [6]: s.div
Out[6]: <div> Hello </div>

In [7]: s.div.next_sibling
Out[7]: u'HiThere'

In [8]: type(s.div.next_sibling)
Out[8]: bs4.element.NavigableString

我会创建一个 可重用函数 以通过标签获取值,通过 text 查找标签并获取 next sibling:

import re

def find_by_label(soup, label):
    return soup.find("div", text=re.compile(label)).next_sibling

用法:

find_by_label(soup, "Mobile").strip()  # prints "021 427 399"

对于觉得这不是他们想要的未来读者,这可能是您的答案:

for tags in soup.find_all('div'):
    if "profileLabel" in tags['class']:
      print(tags.contents[0])