【问题标题】:Python: Regex v. BeautifulSoup to remove from text <TYPE>Python:Regex v. BeautifulSoup 从文本 <TYPE> 中删除
【发布时间】:2014-11-20 09:29:06
【问题描述】:

我需要从标签&lt;TYPE&gt;EX&lt;/TEXT&gt;&lt;TYPE&gt;XML&lt;/TEXT&gt; 之间的文本中删除所有部分。我正在考虑使用正则表达式如下:

re.sub(r"(?is)<TYPE>EX[^>]*>(.*?)</TEXT>",'',text)

re.sub(r"(?is)<TYPE>XML[^>]*>(.*?)</TEXT>",'',text)

但我继续阅读 StackOverflow,如果 BeautifulSoup 可以完成这项工作,则不要使用 regex。如何使用 BeautifulSoup 删除文本中这些标签之间的内容?我不认为这是正确的:

soup = BeautifulSoup(text.lower())
[s.extract() for s in soup('TYPE')]

我必须指定&lt;TYPE&gt;EX&lt;TYPE&gt;XML。在这两种情况下,结束标签实际上都是&lt;/TEXT&gt;。可以在here 找到一个示例 .txt 文件。应该坚持使用正则表达式吗?

【问题讨论】:

    标签: python parsing beautifulsoup


    【解决方案1】:

    您可以使用正则表达式(是)来匹配包含的文本:

    soup.find_all('TYPE', text=re.compile('^\s*(?:EX|XML)', re.I))
    

    这将找到标记名为TYPE 的所有标记,其直接包含的文本以EXXML 开头(不区分大小写),但允许在开始标记和文本之间留有空格。

    然后您可以提取这些标签以删除它们:

    for type_tag in soup.find_all('TYPE', text=re.compile('^\s*(?:EX|XML)', re.I)):
        type_tag.extract()
    

    我假设您将文档解析为 XML,使用 BeautifulSoup(text, 'xml');否则标签不区分大小写匹配,您需要小写您正在寻找的标签(例如find_all('type', ....))。您需要为 BeautifulSoup 安装 lxml 以支持 XML 解析。

    【讨论】:

    • 我正在尝试这个,我得到这个错误TypeError: 'NoneType' object is not callable for for type_tag in soup.find_all('type', text=re.compile('^\s*(?:ex|xml)', re.I)): type_tag.extract() 我把所有的东西都用小写如下:soup = BeautifulSoup(text.read().lower()) where text = open("C:\\Users\\0001193125-13-416534.txt")。为什么我会收到此错误?感谢您的帮助
    • @Plug4:听起来您使用的是 BeautifulSoup 版本 三个 而不是四个。确保您拥有正确的版本;对于后者,您可以使用from bs4 import BeautifulSoup
    • 我知道这是我的问题。由于我是 BeautifulSoup 的新手,如何将我的 soup 文本导出到 .txt 文件?我试过text_file = open("C:\\Output.txt", "w") text_file.write(soup) text_file.close(),但它给了我这个错误ValueError: I/O operation on closed file
    • 如果我在这里尝试你的建议stackoverflow.com/questions/18968279/… 我得到一个空的.txt 文件...
    • @Plug4:你能为那个问题创建一个新问题吗?
    猜你喜欢
    • 2021-04-24
    • 2023-03-19
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2020-10-27
    相关资源
    最近更新 更多