在不使用RegEx、BeautifulSoup、lXml等情况下找到两个词之间的内容

1 投票
4 回答
1109 浏览
提问于 2025-04-15 12:51

如何找出两个词或一组随机字符之间的内容?

抓取的页面不一定只有HTML,重要的数据可能在JavaScript代码块里面。所以,我不能把JavaScript去掉。

考虑这个情况:

<html>
<body>
<div>StartYYYY "Extract HTML", ENDYYYY

</body>

Some Java Scripts code STARTXXXX "Extract JS Code" ENDXXXX.

</html>

正如你所看到的,HTML的标记可能不完整。我可以获取这个页面,然后不需要担心其他问题,我想找到叫做“提取名字”和“在JavaScript中提取数据这里”的内容。

我想要在Python中做到这一点:

像这样:

data = FindBetweenText(UniqueTextBeforeContent, UniqueTextAfterContent, page)

在这里,页面已经下载,数据会包含我想要的文本。我更倾向于不使用正则表达式,因为有些情况可能对正则表达式来说太复杂了。

4 个回答

0

好吧,这就是用PHP写的代码。毫无疑问,用Python写会有更优雅的方式。

function FindBetweenText($before, $after, $text) {
    $before_pos = strpos($text, $before);
    if($before_pos === false)
        return null;
    $after_pos = strpos($text, $after);
    if($after_pos === false || $after_pos <= $before_pos)
        return null;
    return substr($text, $before_pos, $after_pos - $before_pos);
}
2

如果你确定你的标记是唯一的,可以这样做:

s="""
<html>
<body>
<div>StartYYYY "Extract HTML", ENDYYYY

</body>

Some Java Scripts code STARTXXXX "Extract JS Code" ENDXXXX.

</html>
"""

def FindBetweenText(startMarker, endMarker, text):
    startPos = text.find(startMarker)
    if startPos < 0: return
    endPos = text.find(endMarker)
    if endPos < 0: return

    return text[startPos+len(startMarker):endPos]

print FindBetweenText('STARTXXXX', 'ENDXXXX', s)
0

这是我尝试的结果,已经测试过了。虽然使用了递归,但应该没有多余的字符串重复,尽管使用生成器可能会更有效。

def bracketed_find(s, start, end, startat=0):
    startloc=s.find(start, startat)
    if startloc==-1:
        return []
    endloc=s.find(end, startloc+len(start))
    if endloc == -1:
        return [s[startloc+len(start):]]
    return [s[startloc+len(start):endloc]] + bracketed_find(s, start, end, endloc+len(end))

这是一个生成器版本。

def bracketed_find(s, start, end, startat=0):
    startloc=s.find(start, startat)
    if startloc==-1:
        return
    endloc=s.find(end, startloc+len(start))
    if endloc == -1:
        yield s[startloc+len(start):]
        return
    else:
        yield s[startloc+len(start):endloc]

    for found in bracketed_find(s, start, end, endloc+len(end)):
        yield found

撰写回答