【问题标题】:BeautifulSoup - remove children but keep their contentsBeautifulSoup - 删除孩子但保留他们的内容
【发布时间】:2020-10-20 00:25:41
【问题描述】:

我正在创建一个网络 scraper,但在获取最有可能生成的页面时遇到问题,如下所示:

<html>
<body>
<div >
<code>
    <p class="nt">&lt;my-component</p> <p class="na">v-bind:prop1=</p><p class="s">"parentValue"</p><p class="nt">&gt;&lt;/my-component&gt;</p>
    <p class="c">&lt;!-- Or more succinctly, --&gt;</p>
    <p class="nt">&lt;my-component</p> <p class="na">:prop1=</p><p class="s">"parentValue"</p><p class="nt">&gt;&lt;/my-component&gt;</p>
</code>
</div>
<div>
<code>
    <p class="nt">&lt;my-component</p> <p class="na">v-on:myEvent=</p><p class="s">"parentHandler"</p><p class="nt">&gt;&lt;/my-component&gt;</p>
    <p class="c">&lt;!-- Or more succinctly, --&gt;</p>
    <p class="nt">&lt;my-component</p> <p class="err">@</p><p class="na">myEvent=</p><p class="s">"parentHandler"</p><p class="nt">&gt;&lt;/my-component&gt;</p>

</code>
</div>
</body>
</html>

最重要的是code 标签之间的内容。计划是在

之间提取文本

标签(或者,删除那些

标记并保持 DOM 的其余部分不变。

所以我需要这样的输出:

<html>
<body>
<div >
<code>
  text text and more text
</code>
</div>
</html>
</body>

我的尝试如下..

from bs4 import BeautifulSoup


bs = BeautifulSoup(payload, 'lxml')

with open('/tmp/out.html', 'w+') as f:
    for t in bs.find_all():
        
        for q in t.find_all('code'):
            # print(t.text, t.next_sibling)
            f.write(q.text)


但这并没有给出好的结果..据我所知,bs的主要目的是提取元素,这就是我尝试在另一个文件中重新创建dom的原因。

谢谢!

【问题讨论】:

  • 但是您想要一个简单的code 标签,其中包含其余code 标签的所有内容,或者,一个一个地提取所有内容?而且,所有的内容都是p 拥有的所有文本,是吗?
  • @MrNobody33 好吧,所有不是code 的标签都不应该被修改,按原样保存。 code 标签中的子标签应该被删除,但它们的文本应该被保留。第二个问题,嗯,是的,根据我的经验,代码中的标签很可能是

    标签。

  • for child in bs.find_all('code'): print(child.text, child.next_sibling) 这似乎可行,很好,但不知道如何获得它的父母,
  • 好的,我刚刚发布了一个答案@fugitive!希望它对你有用!

标签: javascript python html web-scraping beautifulsoup


【解决方案1】:

你可以试试这个:

from bs4 import BeautifulSoup

payload='''
<html>
<body>
<div >
<code>
    <p class="nt">&lt;my-component</p> <p class="na">v-bind:prop1=</p><p class="s">"parentValue"</p><p class="nt">&gt;&lt;/my-component&gt;</p>
    <p class="c">&lt;!-- Or more succinctly, --&gt;</p>
    <p class="nt">&lt;my-component</p> <p class="na">:prop1=</p><p class="s">"parentValue"</p><p class="nt">&gt;&lt;/my-component&gt;</p>
</code>
</div>
<div>
<code>
    <p class="nt">&lt;my-component</p> <p class="na">v-on:myEvent=</p><p class="s">"parentHandler"</p><p class="nt">&gt;&lt;/my-component&gt;</p>
    <p class="c">&lt;!-- Or more succinctly, --&gt;</p>
    <p class="nt">&lt;my-component</p> <p class="err">@</p><p class="na">myEvent=</p><p class="s">"parentHandler"</p><p class="nt">&gt;&lt;/my-component&gt;</p>

</code>
</div>
</body>
</html>
'''

soup = BeautifulSoup(payload, 'lxml')

for match in soup.find_all('code'):
    new_t=soup.new_tag('code')
    new_t.string=match.text
    match.replace_with(new_t)

with open(r'prove.html', "w") as file:
    file.write(str(soup))

输出(prove.html)

<html>
<body>
<div>
<code>
&lt;my-component v-bind:prop1="parentValue"&gt;&lt;/my-component&gt;
&lt;!-- Or more succinctly, --&gt;
&lt;my-component :prop1="parentValue"&gt;&lt;/my-component&gt;
</code>
</div>
<div>
<code>
&lt;my-component v-on:myEvent="parentHandler"&gt;&lt;/my-component&gt;
&lt;!-- Or more succinctly, --&gt;
&lt;my-component @myEvent="parentHandler"&gt;&lt;/my-component&gt;
</code>
</div>
</body>
</html>

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 2014-03-02
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多