0

我想知道如何提取多个 XML 文档中所有标签之间的文本,获取文件名,然后将此信息写入 CSV 文件。

目前我得到了这个:

import csv
import glob
from bs4 import BeautifulSoup

dataExtracted = []
for filename in glob.glob(r'*.xml'):
    with open(filename, 'r') as f_in:
        soup = BeautifulSoup(f_in.read(), 'lxml')
    print(filename)
    for i in soup.findAll(text=True):
        print(i)
        dataExtracted.append([filename, i.get_text()])

with open('data.csv', 'w', newline='') as csvfile:
    csv_writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    for row in dataExtracted:
        csv_writer.writerow(row)

当我尝试运行它时出现此错误:

AttributeError: 'NavigableString' object has no attribute 'get_text'

我试图添加这个:

for i in soup.findAll(text=True):
        try:
            print(i)
            dataExtracted.append([filename, i.get_text(strip=True)])
        except NavigableString:
            pass

但现在我得到了这个错误:

catching classes that do not inherit from BaseException is not allowed

所以我认为我没有正确处理错误。

关于我应该如何处理这个问题的任何想法?

4

1 回答 1

0

您可以尝试通过在 for 循环中添加它来测试您的元素是否是可导航字符串,然后通过添加 continue 语句忽略它:

for i in soup.findAll(text=True):
    if isinstance(i, NavigableString):
        continue
    print(filename)
    dataExtracted.append([filename, i.get_text()])

显然,根据您的 BeautifulSoup 版本,您可以使您编写的内容正常工作:
“从 Beautiful Soup 版本 4.10.0 开始,您可以在 NavigableString 对象上调用 get_text()、.strings 或 .stripped_strings。它会返回对象本身,或者什么都没有,所以这样做的唯一原因是当你迭代一个混合列表时。”

4.10.0 是 Pypi 上的最新版本

于 2021-10-28T21:46:01.080 回答