【问题标题】:Extracting text outside of a <div> tag BeautifulSoup提取 <div> 标签 BeautifulSoup 之外的文本
【发布时间】:2015-10-22 06:00:15
【问题描述】:

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

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

我需要&lt;div&gt;标签之外的号码:

我的代码是:

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

但它的输出是 Mobile : 只是它是 &lt;div&gt; 标记内的文本而不是它之外的文本。

那么我们如何提取&lt;div&gt;标签之外的文本呢?

【问题讨论】:

    标签: python html beautifulsoup html-parsing


    【解决方案1】:

    我会创建一个可重用函数来通过标签获取值,通过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"
    

    【讨论】:

    • 为什么使用 re.compile 可以工作?但不是 text="Mobile" 这真的很奇怪
    • 因为re 代表正则表达式,它匹配字符串的一部分,而text='Mobile' 搜索整个文本为'Mobile'
    • @Crispy 知道 re 代表什么,呵呵。实际上它不显示的原因是因为我输入错误。它应该是带有冒号和空格的 text="Mobile :"。我在没有重新编译的情况下再次对其进行了测试,并且效果很好
    【解决方案2】:

    尝试使用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
    

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2013-10-31
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      相关资源
      最近更新 更多