【问题标题】:Unable to parse names properly from some elements无法从某些元素中正确解析名称
【发布时间】:2017-11-08 11:51:44
【问题描述】:

我在 python 中编写了一个脚本来从某些元素中解析出一些名称。当我执行我的脚本时,它会解析名称,但输出看起来很奇怪。名称的解析方式使其看起来像两个大牌。名称由 br 标签分隔。如何单独获取每个名称?

名称所在的元素:

html_content='''
<div class="second-child"><div class="richText"> <p></p>
<p><strong>D<br></strong>Daiwa House Industry<br>Danske Bank<br>DaVita HealthCare Partners<br>Delphi Automotive<br>Denso<br>Dentsply International<br>Deutsche Boerse<br>Deutsche Post<br>Deutsche Telekom<br>Diageo<br>Dialight<br>Digital Realty Trust<br>Donaldson Company<br>DSM<br>DS Smith </p>
<p><strong>E<br></strong>East Japan Railway Company<br>eBay<br>EDP Renováveis<br>Edwards Lifesciences<br>Elekta<br>EnerNOC<br>Enphase Energy<br>Essilor<br>Etsy<br>Eurazeo<br>European Investment Bank (EIB)<br>Evonik Industries<br>Express Scripts&nbsp;<br><br><strong>F<br></strong>Fielmann<br>First Solar<br>FMO<br>Ford Motor<br>Fresenius Medical Care<br><br></p></div></div>
'''

我为解析名称而编写的脚本:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_content,"lxml")
for items in soup.select(".second-child"):
    name = ' '.join([item.text for item in items.select("p")])
    print(name)

我得到的输出(部分结果):

DDaiwa House IndustryDanske BankDaVita HealthCare PartnersDelphi AutomotiveDensoDentsply InternationalDeutsche

我想得到的输出:

DDaiwa House Industry
Danske Bank
DaVita HealthCare Partners
Delphi Automotive
Denso
Dentsply International

仅供参考,当我仔细查看结果时,我会发现每个单独的名称都相互关联,中间没有间隔。

【问题讨论】:

    标签: python string python-3.x web-scraping css-selectors


    【解决方案1】:

    使用item.text 会删除所有标签,您需要将&lt;br&gt; 标签替换为'\n'。使用Ian Mackinnon 提供的问题的答案:Convert &lt;/br&gt; to end line

    你的脚本应该是:

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(html_content,"lxml")
    
    for br in soup.find_all("br"):
        br.replace_with("\n")
    
    for items in soup.select(".second-child"):
        name = ' '.join([item.text for item in items.select("p")])
        print(name)
    

    和输出:

     D
    Daiwa House Industry
    Danske Bank
    DaVita HealthCare Partners
    Delphi Automotive
    Denso
    Dentsply International
    Deutsche Boerse
    Deutsche Post
    Deutsche Telekom
    Diageo
    Dialight
    Digital Realty Trust
    Donaldson Company
    DSM
    DS Smith  E
    East Japan Railway Company
    eBay
    EDP Renováveis
    Edwards Lifesciences
    Elekta
    EnerNOC
    Enphase Energy
    Essilor
    Etsy
    Eurazeo
    European Investment Bank (EIB)
    Evonik Industries
    Express Scripts 
    
    F
    Fielmann
    First Solar
    FMO
    Ford Motor
    Fresenius Medical Care
    

    【讨论】:

    • 感谢 Amjad Gd 的解决方案。它也很有效。
    【解决方案2】:

    查看以下解决方案,如果需要改进,请告诉我:

    for items in soup.select(".second-child"):
        for text_nodes in items.select("p"):
            name = " \n".join([item for item in text_nodes.strings if item])
            print(name)
    

    输出

    D 
    Daiwa House Industry 
    Danske Bank 
    DaVita HealthCare Partners 
    Delphi Automotive 
    Denso 
    Dentsply International 
    Deutsche Boerse 
    Deutsche Post 
    Deutsche Telekom 
    Diageo 
    Dialight 
    Digital Realty Trust 
    Donaldson Company 
    DSM 
    DS Smith 
    E 
    East Japan Railway Company 
    eBay 
    EDP Renováveis 
    Edwards Lifesciences 
    Elekta 
    EnerNOC 
    Enphase Energy 
    Essilor 
    Etsy 
    Eurazeo 
    European Investment Bank (EIB) 
    Evonik Industries 
    Express Scripts  
    F 
    Fielmann 
    First Solar 
    FMO 
    Ford Motor 
    Fresenius Medical Care
    

    【讨论】:

    • 谢谢安德森爵士。它工作得很好。无需改进。再次感谢。
    • 你简直把我逼疯了,先生。每次您在提供解决方案的同时提出更新的方法。你能简单地告诉我这个strings在这里做什么文本不能吗?再次感谢,先生。
    • 例如,对于 soup.select(".second-child")[0] 节点 text 属性将返回文本作为一个 looong 单个字符串,而 strings 属性将返回所有后代文本节点的生成器
    猜你喜欢
    • 2018-05-30
    • 1970-01-01
    • 2019-11-14
    • 2018-08-26
    • 2013-06-17
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多