如何在html文件中执行与标记无关的文本字符串搜索?

2024-10-02 04:36:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用LanguageTool(LT)并启用了--xmlfilter选项来拼写检查HTML文件。这将强制LanguageTool在运行拼写检查之前删除所有标记。在

这也意味着所有报告的字符位置都是关闭的,因为它看不到标签。在

例如,如果我检查以下HTML片段:

<p>This is kin<b>d</b> o<i>f</i> a <b>stupid</b> question.</p>

LanguageTool将其视为纯文本句子:

^{pr2}$

并返回以下消息:

^{3}$

(在本例中,它标记了“kind of a.”)

由于搜索字符串可能被包装在标记中,并且可能多次出现,所以我无法进行简单的索引搜索。在

在HTML文件中可靠地定位给定文本字符串的最有效的Python解决方案是什么?(它返回一个大致的字符位置,根据标记的数量以及标记单词前后的单词,该位置可能会关闭10-30%。)

也就是说,我需要做一个搜索,忽略所有的标签,但包括他们的字符位置计数。在

在这个特定的例子中,我必须找到“a类”并找到字母k的位置:

kin<b>d</b> o<i>f</i>a

Tags: 文件字符串标记文本lthtml选项报告
2条回答

{cd1>因为这个选项而被弃用。正确的解决方案是自己删除标记,但保留位置,这样您就有一个映射来更正从LT返回的结果。当从Java使用LT时,AnnotatedText支持这一点,但是算法应该足够简单,可以移植它。(全面披露:我是LT的维护者)

这可能不是最快的方法,但是pyparsing可以识别大多数形式的HTML标记。下面的代码反转典型的扫描,创建一个匹配任何单个字符的扫描仪,然后配置扫描仪跳过HTML打开和关闭标记,以及常见的HTML '&xxx;'实体。pyparsing的scanString方法返回一个生成器,该生成器生成匹配的标记、每个匹配的开始和结束位置,因此很容易构建一个列表,将标记之外的每个字符映射到其原始位置。从这里开始,剩下的几乎就是''.join并索引到列表中。请参见下面代码中的注释:

test = "<p>This &nbsp;is kin<b>d</b> o<i>f</i> a <b>stupid</b> question.</p>"

from pyparsing import Word, printables, anyOpenTag, anyCloseTag, commonHTMLEntity

non_tag_text = Word(printables+' ',  exact=1).leaveWhitespace()
non_tag_text.ignore(anyOpenTag | anyCloseTag | commonHTMLEntity)

# use scanString to get all characters outside of tags, and build list
# of (char,loc) tuples
char_locs = [(t[0], loc) for t,loc,endloc in non_tag_text.scanString(test)]

# imagine a world without HTML tags...
untagged = ''.join(ch for ch, loc in char_locs)

# look for our string in the untagged text, then index into the char,loc list
# to find the original location
search_str = 'kind of a'
orig_loc = char_locs[untagged.find(search_str)][1]

# print the test string, and mark where we found the matching text
print(test)
print(' '*orig_loc + '^')

"""
Should look like this:

<p>This &nbsp;is kin<b>d</b> o<i>f</i> a <b>stupid</b> question.</p>
                 ^
"""

相关问题 更多 >

    热门问题