首页 > 解决方案 > 从简单的 html 中提取文本和(hlStart 和 hlEnd)标签

问题描述

我有以下部分的 html/xml 文件:

<p><hlstart ana="#ann224094"></<hlstart>Przed<hlend ana="#ann224094"></hlend> <hlstart ana="#ann224160"></hlstart>nami <hlend ana="#ann224160"></hlend>jeszcze trzy <hlstart ana="#ann224159"></hlstart>dni,<hlend ana="#ann224159"></hlend></p>

我想提取文本和标签以将它们排列在表格中,例如:

text, nonana
text, ana

其中 ana 表示标签,例如 #ann224094 来自

<hlstart ana="#ann224094"></<hlstart>Przed<hlend ana="#ann224094"></hlend> 

nonana 表示文本没有 ana 标记。

przed, #ann224094
nami, #ann224160
jeszcze trzy, nonana

我已经用我的 xml 数据的其他部分尝试了 bs4 和 htmlparser,但我不明白那部分。我可以使用 .text 方法导出整个文本,所有字符串,但我需要知道哪些单词有 ana 标签。此外,所有带有 ana 标签的单词在我的文件后面都有特定的标签。

标签: pythonrxml-parsinghtml-parsingtei

解决方案


from bs4 import BeautifulSoup

txt = '''<p><hlstart ana="#ann224094"></hlstart>Przed<hlend ana="#ann224094"></hlend> <hlstart ana="#ann224160"></hlstart>nami <hlend ana="#ann224160"></hlend>jeszcze trzy <hlstart ana="#ann224159"></hlstart>dni,<hlend ana="#ann224159"></hlend></p>'''

soup = BeautifulSoup(txt, 'html.parser')

out = []
for t in soup.find_all(text=True):
    if t.strip() == '':
        continue

    prev = t.find_previous_sibling()
    if prev.name == 'hlstart':
        out.append( (t, prev['ana']) )
    else:
        out.append( (t, 'noana') )

# print it to screen:
from pprint import pprint
pprint(out)

印刷:

[('Przed', '#ann224094'),
 ('nami ', '#ann224160'),
 ('jeszcze trzy ', 'noana'),
 ('dni,', '#ann224159')]

推荐阅读