【问题标题】:BS4: Wrap range of siblings with new tagsBS4:用新标签包装一系列兄弟姐妹
【发布时间】:2019-11-08 12:13:00
【问题描述】:

我正在使用 BeautifulSoup 4.8.1。

我想扩充一个 HTML 文件以突出显示感兴趣的部分。

举个例子吧。假设我得到了

<div> some preceding junk </div>
<div> BEGIN TRIGGER </div>
<div> Lorem ipsum dolor </div>
<div> sit amet, consetetur elitir </div>
<div> more clutter at the end </div>
<div> END TRIGGER </div>

我已经能够提取包含中间四个&lt;div&gt; 标签的列表(即从“BEGIN TRIGGER”到“clutter”,包括)。

我想产生以下输出:

<div> some preceding junk </div>
<p>
 <div> BEGIN TRIGGER </div>
 <div> Lorem ipsum dolor </div>
 <div> sit amet, consetetur elitir </div>
 <div> more clutter at the end </div>
</p>
<div> END TRIGGER </div>

我怎样才能做到这一点?我认为知道如何为已知的 bs4.element.Tag 创建一个新的兄弟姐妹可能会有所帮助,如果无法“原子地”包装整个范围。

【问题讨论】:

    标签: html beautifulsoup


    【解决方案1】:

    根据您的示例,我已经尝试过。希望这会有所帮助。 使用正则表达式首先很好地元素想要在之前添加标签,然后find_next_siblings() 直到找到为止。

    最后添加新标签

    然后在里面添加所有的 div 标签。

    import re
    from bs4 import BeautifulSoup
    
    html='''<div> some preceding junk </div>
    <div> BEGIN TRIGGER </div>
    <div> Lorem ipsum dolor </div>
    <div> sit amet, consetetur elitir </div>
    <div> more clutter at the end </div>
    <div> END TRIGGER </div>'''
    
    soup=BeautifulSoup(html,'html.parser')
    search=soup.find("div",text=re.compile('BEGIN'))
    prev=search.find_previous_siblings('div')[0]
    
    new_tag = soup.new_tag("p")
    new_tag.append(str(search) +'\n')
    for item in search.find_next_siblings('div'):
    
        if 'END TRIGGER' in item.text:
           lastement=item
           break;
        else:
            new_tag.append(str(item) + '\n')
    
    finalsoup=str(prev) +'\n' + new_tag.prettify(formatter=None) + '\n' + str(lastement)
    
    print(finalsoup)
    

    输出

    <div> some preceding junk </div>
    <p>
     <div> BEGIN TRIGGER </div>
     <div> Lorem ipsum dolor </div>
     <div> sit amet, consetetur elitir </div>
     <div> more clutter at the end </div>
    </p>
    <div> END TRIGGER </div>
    

    【讨论】:

    • 在我看来,这更像是一些棘手的字符串操作,而不是操作实际的 HTML 树。你知道如何实现后者吗?
    • 确实这是一个棘手的字符串操作。没有通用的方法来实现这种用例。
    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2014-07-12
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2020-01-31
    相关资源
    最近更新 更多