我有这个html标签:
x=""" <div>ad</div> \n\n <div> correct value </div> <div> wrong value </div> """
我想获得corret value
所以我搜索单词ad
后跟</div>
然后搜索任何内容,直到另一个<div>
然后获取所有值,直到</div>
我使用此代码:
re.findall(r'ad</div>.*<div>(.*)</div>',x,re.S)
我使用falg re.S因为我希望点也匹配新线。我不知道div之间有多少行。所以我用。*!
我认为findall应该返回correct value
,但它返回wrong value
。为什么?它搜索最后一个不是第一个div?
答案 0 :(得分:3)
因为你拥有的是贪心
试试懒惰:
re.findall(r'ad</div>.*?<div>(.*?)</div>',x,re.S)
在您的示例中.*
实际上是将所有内容匹配到最后,然后它会看到<div>
,然后您的正则表达式返回跟踪并再次开始匹配,类似于第二种情况,
演示:
答案 1 :(得分:0)
如果您想在2
特殊字符串之间找到符号,请使用Lookahead and Lookbehind Assertions
:
>>> re.findall(r'(?<=\<div\>)[\w ]+(?=\<\/div\>)',x)
['ad', ' correct value ', ' wrong value ']
>>> re.findall(r'(?<=\<div\>)[\w ]+(?=\<\/div\>)',x)[1].strip()
'correct value'
答案 2 :(得分:0)
答案 3 :(得分:0)
通过专门用于解析html文件的工具。
>>> from bs4 import BeautifulSoup
>>> x=""" <div>ad</div> \n\n <div> correct value </div> <div> wrong value </div> """
>>> soup = BeautifulSoup(x)
>>> for i, x in enumerate(soup.find_all('div')):
if x.string == 'ad':
count = count + i + 1
>>> count
1
>>> soup.find_all('div')[count].string
' correct value '
>>> soup.find_all('div')[count].string.strip()
'correct value'