Поиск контента между двумя словами без RegEx, BeautifulSoup, lXml ... и т. Д. - PullRequest
1 голос
/ 12 июля 2009

Как узнать содержимое между двумя словами или двумя наборами случайных символов?

Не всегда гарантируется, что страница соскоба будет содержать только 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 ]

2 голосов
/ 12 июля 2009

, если вы уверены, что ваши маркеры уникальны, сделайте что-то вроде этого

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 голосов
/ 12 июля 2009

Вот моя попытка, это проверено.Хотя рекурсивно, не должно быть ненужного дублирования строк, хотя генератор может быть более оптимальным

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
0 голосов
/ 12 июля 2009

[Слегка протестировано]

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)
0 голосов
/ 12 июля 2009

Ну, это то, что было бы в 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);
}
...