在不使用RegEx、BeautifulSoup、lXml等情况下找到两个词之间的内容
如何找出两个词或一组随机字符之间的内容?
抓取的页面不一定只有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