【发布时间】:2013-08-21 16:06:25
【问题描述】:
让我先展示我将要处理的 3 种不同类型的字符串:
"<h1>Money Shake</h1><p>Money<br>Money<br>MORE MONEY</p><p>Take money and stuff in blender.</p><p>Blend.</p>"
"<h1>Money Shake</h1><p>Posted by Gordon Gekko</p><p>Money<br>Money<br>MORE MONEY</p><p>Take money and stuff in blender.</p><p>Blend.</p>"
"<h1>Money Shake</h1><p>Posted by Gordon Gekko</p><p>They're great</p><p>Yield: KA-CHING</p><p>Money<br>Money<br>MORE MONEY</p><p>Take money and stuff in blender.</p><p>Blend.</p>"
基本上,我想做的是撕掉有成分的块:
"<p>Money<br>Money<br>MORE MONEY</p>"
这是我正在使用的正则表达式:
re.search(r'<p>[^</p>](.*)<br>(.*?)</p>', string, re.I)
当我在第一个和第二个字符串上使用它时,它完全符合我的要求并返回这个匹配对象:
"<p>Money<br>Money<br>MORE MONEY</p>"
但是当我在第三个字符串上使用它时,它会返回这个匹配对象:
"<p>They're great</p><p>Yield: KA-CHING</p><p>Money<br>Money<br>MORE MONEY</p>"
我搞砸了什么?
@Blender
嗨,Blender,这是我在抓取我想要的块时想出的。我确信有更好的方法,但考虑到我已经进入 Python / 编程 2 周:
def get_ingredients(soup):
for p in soup.find_all('p'):
if p.find('br'):
return p
ingredients = get_ingredients(soup)
p_list = soup.find_all('p')
ingredient_index = p_list.index(ingredients)
junk = []
junk += p_list[:ingredient_index]
instructions = []
instructions += p_list[ingredient_index+1:]
【问题讨论】:
-
“我搞砸了什么?”我不想做出判断,但这里的共识是 HTML 和正则表达式不混合。即使在搅拌机中。
-
[^</p>]并不是你想象的那样。它是“不是任何<>/p符号”。我想你需要(?!</p>) -
我不是在拖钓。当然,我不像你们这样的专家,但这就是我想出的。我见过 1732348 ,但在这种情况下,把它扔给我并不是很有帮助。我知道您可能会因为 html 标签中的内容而认为我在拖钓。好的,我被指派浏览一个食谱数据库并隔离成分和说明。这就是我这样做的原因。我不想提出一个正确的食谱,因此做了这个摇钱树的例子。就这些。请停止抨击新手。我正在努力学习。
-
伙计们,我想你可能已经在这个问题上抢了先机。这不是你想的那样。