看起来你想要的是一个 HTML 解析器。 HTML Parser 是复杂的东西。因此,您想使用现有的库(创建自己的库很困难,并且在许多边缘情况下可能会失败)。不幸的是,正如this question 中强调的那样,大多数现有的 HTML 解析库不保留位置信息。好消息是,一个可靠地保留位置信息的 HTML 解析器位于 Python 标准库中(请参阅HTMLParser)。由于您使用的是 Python 3,因此该解析器的问题已得到修复。
一个基本示例可能如下所示:
from html.parser import HTMLParser
class StripTextParser(HTMLParser):
def __init__(self, *args, **kwargs):
self.data = []
super(StripTextParser, self).__init__(*args, **kwargs)
def handle_data(self, data):
if data.strip():
# Only use wtrings which are contain more than whitespace
startpos = self.getpos()
# `self.getpos()` returns `(line, column)` of start position.
# Use that plus length of data to calculate end position.
endpos = (startpos[0], startpos[1] + len(data))
self.data.append((data, startpos, endpos))
def strip_text(html):
parser = StripTextParser()
parser.feed(html)
return parser.data
test1 = "<sup><sup>There</sup></sup> <sup><sup>was</sup></sup> <sup><sup>another</sup></sup> <sup><sup>thread</sup></sup> <sup><sup>like</sup></sup> <sup><sup>this</sup></sup>"
print(strip_text(test1))
# Ouputs: [('There', (1, 10), (1, 15)), ('was', (1, 38), (1, 41)), ('another', (1, 64), (1, 71)), ('thread', (1, 94), (1, 100)), ('like', (1, 123), (1, 127)), ('this', (1, 150), (1, 154))]
test2 = """
<ul>
<li>https://steamcommunity.com/tradeoffer/new/partner=30515749&token=WOIxg5eB</li>
<li>79</li>
<li>Why did the elephants get kicked out of the public pool? THEY KEPT DROPPING THEIR TRUNKS! </li>
</ul>
"""
print(strip_text(test2))
# Outputs: [('https://steamcommunity.com/tradeoffer/new/partner=30515749&token=WOIxg5eB', (3, 4), (3, 77)), ('79', (4, 4), (4, 6)), ('Why did the elephants get kicked out of the public pool? THEY KEPT DROPPING THEIR TRUNKS! ', (5, 4), (5, 95))]
test3 = "<em><strike>a</strike></em>"
print(strip_text(test3))
# Outputs: [('a', (1, 12), (1, 13))]
没有关于输出所需格式的更多具体信息,我只是创建了一个元组列表。当然,您可以重构以满足您的特定需求。如果您想要所有空格,请删除 if data.strip(): 行。