首页 > 解决方案 > Python Beautiful Soup unwrap() 没有按预期工作 - 想要提取标签的内容

问题描述

我是使用 Beautiful Soup 的新手,并且无法理解为什么unwrap()在我的情况下它的工作方式。

我有python 3.6.9beautifulsoup4 4.8.2

我的输入 HTML 是:

 html='''
    <html>
    <head>
        <meta charset="utf-8"/>
        <link rel="stylesheet" type="text/css" href="../../common/style.css"/>
    </head>
    <body>
    <div id="content">
       <h3  HEAD /h3>
          <div class="myclass">
          <br>
          MY TEXT
          <br>
         </div>
        <h3  HEAD2 /h3>
          <div class="myclass">
          <br>
          MY TEXT 2
          <br>
         </div>
    </div>
    </body>
    </html>
    '''  

我想divid“内容”来获取内容。我认为这将通过使用来完成unwrap()

soup=BeautifulSoup(html, 'lxml')    
content=soup.find('div', {"id": "content"}).unwrap()

但这给了我标签,没有它的内容:

print(content):

<div id="content"></div>

这里会发生什么?如何正确提取标签的内容,而不保留周围的标签?

我期望的输出是:

   <h3  HEAD /h3>
      <div class="myclass">
      <br>
      MY TEXT
      <br>
     </div>
    <h3  HEAD2 /h3>
      <div class="myclass">
      <br>
      MY TEXT 2
      <br>
     </div>

当使用该方法时.children,当附加到 BeautifulSoup 对象时,我遇到了转义标签的问题:

final_content=''.join([str(i) for i in content.children]) 
body.append(final_content)

这导致:

&lt;h3 head=""&gt;
&lt;div class="myclass"&gt;
&lt;br/&gt;
      MY TEXT
      &lt;br/&gt;
&lt;/div&gt;
&lt;h3 head2=""&gt;
&lt;div class="myclass"&gt;
&lt;br/&gt;
      MY TEXT 2
      &lt;br/&gt;
&lt;/div&gt;
&lt;/h3&gt;&lt;/h3&gt;</div>

标签: pythonbeautifulsoup

解决方案


TL;DR:打印soup,不是content

我有同样的问题,无法弄清楚为什么unwrap()不返回我想要的。原因是它的工作方式与我们预期的略有不同。

unwrap()清除初始汤中的标签并返回标签。我们保存在其他变量中的任何内容都soup.find()将只包含标签,不包含内容。


推荐阅读