代码之家  ›  专栏  ›  技术社区  ›  Avraham

如何在JS中将beautifulsoup中的文本设置为.innerText而非.textContent

  •  1
  • Avraham  · 技术社区  · 10 月前

    我有一个HTML文件,其中包含p标签内的文本,类似于这样:

    <body>
        <p>Lorem ipsum dolor sit amet, 
            consectetur adipiscing elit. 
            Maecenas sed mi lacus. 
            Vivamus luctus vehicula lacus, 
            ut malesuada justo posuere et. 
            Donec ut diam volutpat</p>
    </body>
    

    使用Python和BeautifulSoup,我试图找到p标签中的文本,比如:

    with open("foo.html", 'r', encoding='utf-8') as f:
        soup = BeautifulSoup(f.read(), 'lxml')
    p = soup.p
    print(p.text)
    

    结果: 'Lorem ipsum dolor sit amet, \n\t\tconsectetur adipiscing elit. \n\t\tMaecenas sed mi lacus. \n\t\tVivamus luctus vehicula lacus, \n\t\tut malesuada justo posuere et. \n\t\tDonec ut diam volutpat'

    问题是,我将结果与原始文件中出现的\n和\t(如JS中的.textContent)一起获得。我需要一个类似于JS中的.innerText的解决方案,它会在用户在浏览器中看到时返回。

    我试着用 p.text.replace("\n", " ").replace("\t", "") 但对于更复杂的事情,比如标签中的标签,它根本不起作用(比如不必要的空格)。

    有人知道怎么做吗?提前感谢!

    1 回复  |  直到 10 月前
        1
  •  1
  •   Andrej Kesely    10 月前

    如果我没理解错的话,你可以用正则表达式来改变文本。考虑这个例子:

    from bs4 import BeautifulSoup
    
    html_text = """\
    <body>
        <p>Lorem ipsum dolor sit amet,
            consectetur adipiscing elit.
            Maecenas sed mi lacus.
                <span>This is inner span.</span>
            Vivamus luctus vehicula lacus,
            ut malesuada justo posuere et.
            Donec ut diam volutpat</p>
    </body>"""
    
    soup = BeautifulSoup(html_text, "html.parser")
    print(soup.p.text)
    

    打印:

    Lorem ipsum dolor sit amet,
            consectetur adipiscing elit.
            Maecenas sed mi lacus.
                This is inner span.
            Vivamus luctus vehicula lacus,
            ut malesuada justo posuere et.
            Donec ut diam volutpat
    

    然后,您可以执行以下操作:

    import re
    
    print(re.sub(r"\s{2,}", " ", soup.p.text))
    

    这句话:

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed mi lacus. This is inner span. Vivamus luctus vehicula lacus, ut malesuada justo posuere et. Donec ut diam volutpat