【问题标题】:extract text in bs4 element提取 bs4 元素中的文本
【发布时间】:2018-06-21 13:00:49
【问题描述】:

我正在尝试从以下 bs4 元素(示例如下)中提取一些数据,特别是构建一个可以从中提取所有公司名称(可能还有位置)的循环:

    [<div class="views-field views-field-field-overigeonderdelen"> <span class="views-label views-label-field-overigeonderdelen">Nevenvestiging: </span> <div class="field-content"><div class="wrapper hidden">
 <p>Hak Industrial Services B.V., Hoogeveen<br/>Nederland<br/> blabla useless data<br/></p><hr/>
 Hak Industrial Services B.V., Nieuw Heeten<br/>Nederland<br/>blabla useless data<br/><hr/>
 Hak Industrial Services Middle East LLC, Abu Dhabi<br/>Verenigde Arabische Emiraten<br/>blabla useless data<br/><hr/>
 Hak Industrial Services SEA Sdn. Bhd., Petaling Jaya, Selangor<br/>Maleisië<br/>blabla useless data<br/><hr/>
 Hak Industrial Services USLLC, Houston<br/>Verenigde Staten van Amerika<br/>blabla useless data<br/><hr/>
 </div>
 <a class="toggle" href="#">Toon nevenvestigingen</a></div> </div>]

名称是“Hak Industrial ...”字符串。

输出:两个类似

的列表
[Hak Industrial Services B.V., Hak Industrial Services B.V., Hak Industrial Services Middle East LLC, Hak Industrial Services SEA Sdn. Bhd., Hak Industrial Services USLLC]

[Nederland, Nederland, Verenigde Arabische Emiraten, Maleisië, Verenigde Staten van Amerika]

有人知道如何在 bs4 中做到这一点吗?

提前致谢,

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    我最近不得不完成一个类似的目标。我构建了一个函数来解析电子邮件中的 HTML。它是这样的;

    from bs4 import BeautifulSoup as bs
    
    def parser(data):
        # this will parse the data from ticket and create a list.
        html = data
        parsed = bs(html, "lxml")
        data = [line.strip() for line in parsed.stripped_strings]
        print data
    

    传入 HTML 会得到这样的输出;

    [u'[', u'Nevenvestiging:', u'Hak Industrial Services B.V., Hoogeveen', u'Nederland', u'blabla useless data', u'Hak Industrial Services B.V., Nieuw Heeten', u'Nederland', u'blabla useless data', u'Hak Industrial Services Middle East LLC, Abu Dhabi', u'Verenigde Arabische Emiraten', u'blabla useless data', u'Hak Industrial Services SEA Sdn. Bhd., Petaling Jaya, Selangor', u'Maleisi\xeb', u'blabla useless data', u'Hak Industrial Services USLLC, Houston', u'Verenigde Staten van Amerika', u'blabla useless data', u'Toon nevenvestigingen', u']']
    

    您可能可以稍微重构一下,使其更像您正在寻找的东西,但我希望这会为您指明正确的方向。

    【讨论】:

    • 谢谢,正是我想要的!只是不确定 for 循环是如何工作的:data = [line.strip() for line in parsed.stripped_strings]
    【解决方案2】:

    必须保存哪种格式的数据?我试着解析一下。

    # coding: utf-8
    from __future__ import unicode_literals
    from bs4 import BeautifulSoup
    from bs4 import NavigableString, Tag
    
    html = """<div class="views-field views-field-field-overigeonderdelen"> <span class="views-label views-label-field-overigeonderdelen">Nevenvestiging: </span> <
     <p>Hak Industrial Services B.V., Hoogeveen<br/>Nederland<br/> blabla useless data<br/></p><hr/>
      Hak Industrial Services B.V., Nieuw Heeten<br/>Nederland<br/>blabla useless data<br/><hr/>
       Hak Industrial Services Middle East LLC, Abu Dhabi<br/>Verenigde Arabische Emiraten<br/>blabla useless data<br/><hr/>
        Hak Industrial Services SEA Sdn. Bhd., Petaling Jaya, Selangor<br/>Maleisië<br/>blabla useless data<br/><hr/>
         Hak Industrial Services USLLC, Houston<br/>Verenigde Staten van Amerika<br/>blabla useless data<br/><hr/>
          </div>
           <a class="toggle" href="#">Toon nevenvestigingen</a></div> </div>"""
    
    if __name__ == "__main__":
        soup = BeautifulSoup(html, "lxml")
        companies = []
        for child in soup.find("div", class_ = "wrapper hidden").contents:
            siblings = []
            if isinstance(child, Tag):
                if child.name == "hr":
                    previous = child.previous_sibling
                    if previous:
                        siblings.append(previous)
                    while previous:
                         if isinstance(previous, Tag) and previous.name != "hr" or isinstance(previous, NavigableString):
                             siblings.append(previous)
                             previous = previous.previous_sibling
                         else:
                             previous = False
    
    
                    print siblings[::-1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多