1

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

抓取的页面不保证仅为 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)

下载页面的位置和数据将包含我正在寻找的文本。我宁愿远离 regEx,因为有些情况对于 RegEx 来说可能太复杂了。

4

4 回答 4

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)
于 2009-07-12T15:18:04.507 回答
0

嗯,这就是它在 PHP 中的样子。毫无疑问,有一种更性感的 Pythonic 方式。

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);
}
于 2009-07-12T15:04:39.200 回答
0

[略微测试]

def bracketed_find_first(prefix, suffix, page, start=0):
    prefixpos = page.find(prefix, start)
    if prefixpos == -1: return None # NOT ""
    startpos = prefixpos + len(prefix)
    endpos = page.find(suffix, startpos) # DRY
    if endpos == -1: return None # NOT ""
    return page[startpos:endpos]

注意:上面只返回第一次出现。这是一个产生每次出现的生成器。

def bracketed_finditer(prefix, suffix, page, start_at=0):
    while True:
        prefixpos = page.find(prefix, start_at)
        if prefixpos == -1: return # StopIteration
        startpos = prefixpos + len(prefix)
        endpos = page.find(suffix, startpos)
        if endpos == -1: return
        yield page[startpos:endpos]
        start_at = endpos + len(suffix)
于 2009-07-12T15:18:05.100 回答
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
于 2009-07-12T15:29:56.700 回答