Python 使用正则表达式、BeautifulSoup、lXml查找两个单词之间的内容。。。等

Python 使用正则表达式、BeautifulSoup、lXml查找两个单词之间的内容。。。等,python,screen-scraping,fetch,Python,Screen Scraping,Fetch,如何找出两个单词或两组随机字符之间的内容 刮取的页面不能保证仅为Html,重要数据可以在javascript块中。因此,我无法删除JavaScript 考虑这一点: <html> <body> <div>StartYYYY "Extract HTML", ENDYYYY </body> Some Java Scripts code STARTXXXX "Extract JS Code" ENDXXXX. </html> 下载页面

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

刮取的页面不能保证仅为Html,重要数据可以在javascript块中。因此,我无法删除JavaScript

考虑这一点:

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

</body>

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

</html>

下载页面和数据的地方会有我要找的文本。我宁愿远离regEx,因为有些情况对于regEx来说太复杂了。

好吧,这就是PHP中的情况。毫无疑问,有一种更性感的蟒蛇方式

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);
}
函数在文本($before,$after,$text)之间查找{
$before_pos=strpos($text$before);
如果($before_pos==false)
返回null;
$after_pos=strpos($text$after);

如果($after_pos==false | |$after_pos如果您确定您的标记是唯一的,请执行以下操作

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)
s=”“”
StartYYYY“提取HTML”,endyyy
一些Java脚本代码STARTXXXX“提取JS代码”ENDXXXX。
"""
def FindBetween文本(起始标记、结束标记、文本):
startPos=text.find(startMarker)
如果startPos<0:返回
endPos=text.find(endMarker)
如果endPos<0:返回
返回文本[startPos+len(startMarker):endPos]
打印FindBetween文本('STARTXXXX','ENDXXXX',s)
[轻微测试]

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)

这是我的尝试,这是经过测试的。虽然是递归的,但不应该有不必要的字符串重复,尽管生成器可能更为理想

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

在您的示例中,
uniquetextforecontent,uniquetexaftercontent
是什么?“因为有些情况对于RegEx来说可能太复杂了。”怎么会呢?你在前后都有独特的文本。这并不特别复杂,在正则表达式中也很容易做到。但如果他有独特的标记,为什么要麻烦正则表达式呢?是的。正则表达式并不是不能处理它,但它们太过杀伤力了。@Lennart,我不同意——这是一个最好由正则表达式处理的案例(我绝对不是正则表达式的粉丝,注意;-).尽管如此,如果OP不想听到他问题的最佳解决方案,因为错误地认为“案例对于RegEx来说可能太复杂”(如果信任他的规范,这是绝对不可能的),我不会去讨好落选者——反对OP的错误信念不会让我被接受,一旦我达到200分的上限(通常是晚上早些时候;-)只有接受有帮助!)text=“ppppyyyyyyaddaxxxxblayyyyyyqqq”在文本(“XXXX”,“YYYY”,text)之间找到…这会生成“”,但可能OP更喜欢“blah”是的,可能会有更复杂的标记嵌入标记中的情况,这里我假设OP说的是“唯一标记”,您可以扩展示例以从这一文本块中删除日期吗?“加利福尼亚,美国2009年6月12日状态:活动”请注意,位置、日期和状态是变量,可以不同。例如“US”或“2009”不能用作结束标记。请告诉我html中唯一的标记,我会告诉您日期。我测试了您的第一个版本,并且在一次出现时运行良好。@VN44CA:我很惊讶您接受的答案不仅比我的答案晚,而且是递归的。有什么特殊原因吗?
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