使用 BeautifulSoup 删除第一个子节点

Posted

技术标签:

【中文标题】使用 BeautifulSoup 删除第一个子节点【英文标题】:Delete first child node using BeautifulSoup 【发布时间】:2015-02-03 19:45:56 【问题描述】:
import os
from bs4 import BeautifulSoup
do = dir_with_original_files = 'C:\FOLDER'
dm = dir_with_modified_files = 'C:\FOLDER'
for root, dirs, files in os.walk(do):
    for f in files:
        print f.title()
        if f.endswith('~'): #you don't want to process backups
            continue
        original_file = os.path.join(root, f)
        mf = f.split('.')
        mf = ''.join(mf[:-1])+'_mod.'+mf[-1] # you can keep the same name 
                                             # if you omit the last two lines.
                                             # They are in separate directories
                                             # anyway. In that case, mf = f
        modified_file = os.path.join(dm, mf)
        with open(original_file, 'r') as orig_f, \
             open(modified_file, 'w') as modi_f:
            soup = BeautifulSoup(orig_f.read())

            for t in soup.find_all('table'):
                for child in t.find_all("table"):#*****this is fine for now, but how would I restrict it to find only the first element?
                    child.REMOVE() #******PROBLEM HERE********

            # This is where you create your new modified file.
            modi_f.write(soup.prettify().encode(soup.original_encoding)) 

大家好,

我正在尝试使用 BeautifulSoup 对文件进行一些解析以稍微清理它们。我想要的功能是我想删除表中任何位置的第一个表,例如:

<table>
  <tr>
    <td></td
  </tr>
  <tr>
    <td><table></table><-----This will be deleted</td
  </tr>
  <tr>
    <td><table></table> --- this will remain here.</td
  </tr>
</table>

目前,我的代码设置为查找表中的所有表,并且我编写了一个 .REMOVE() 方法来显示我希望完成的任务。我怎样才能真正删除这个元素?

Tl;博士 -

如何调整我的代码以仅查找第一个嵌套表 文件。

如何删除此表?

【问题讨论】:

【参考方案1】:

找到表中的第一个表并在其上调用extract()

inner_table = soup.find('table').find('table')  # or just soup.table.table
inner_table.extract() 

【讨论】:

非常感谢您的回复。是否也可以删除表的所有子节点? :) 谢谢。 @SimonKiely 你是指外部内部的其他内部table 标签吗?谢谢。

以上是关于使用 BeautifulSoup 删除第一个子节点的主要内容,如果未能解决你的问题,请参考以下文章

如何从 BeautifulSoup ( Python ) 中的表中获取第一个子表行

jquery第一个子节点怎么获得

BeautifulSoup研究一

使用 local-name() 获取 XSLT 中的第一个子节点

BST:在 Java 中删除具有 2 个子节点的节点

怎样在当前节点的第一个子元素节点之前增加子元素节点或子文本节点