【问题标题】:How can I extract a <p> containing <br> elements with a regex?如何使用正则表达式提取包含 <br> 元素的 <p>?
【发布时间】: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 和正则表达式不混合。即使在搅拌机中。
  • [^&lt;/p&gt;] 并不是你想象的那样。它是“不是任何&lt;&gt;/p 符号”。我想你需要(?!&lt;/p&gt;)
  • 我不是在拖钓。当然,我不像你们这样的专家,但这就是我想出的。我见过 1732348 ,但在这种情况下,把它扔给我并不是很有帮助。我知道您可能会因为 html 标签中的内容而认为我在拖钓。好的,我被指派浏览一个食谱数据库并隔离成分和说明。这就是我这样做的原因。我不想提出一个正确的食谱,因此做了这个摇钱树的例子。就这些。请停止抨击新手。我正在努力学习。
  • 伙计们,我想你可能已经在这个问题上抢了先机。这不是你想的那样。

标签: python html regex


【解决方案1】:

只需使用适当的 HTML 解析器。它会比正则表达式更直观,并且可以实际工作:

# May need to install it:
# pip install BeautifulSoup4

from bs4 import BeautifulSoup

soup = BeautifulSoup("""
    <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>
""")

def get_ingredients(soup):
    for p in soup.find_all('p'):
        if p.find('br'):
            return p.find_all(text=True)

【讨论】:

  • 嗨搅拌机,这太棒了!谢谢!我不知道如何把它变成我想要做的。好的,所以我打算做的是获取字符串,然后编写一个带有列的csv文件:'Header','Junk','Ingredients','Instructions',然后将块拉出到它们各自的列中,即“

    Money Shake

    ”在“标题”下,“

    由 Gordon Gekko 发布

    他们很棒

    产量:KA-CHING

    ”在“垃圾”等下。抱歉给您添麻烦了。感谢您的帮助。
  • 我是一个菜鸟很清楚,我什至无法在评论中格式化我的回复,或者我想回复的内容可能没有办法这样做。 @Blender 我将编辑我的问题,向您展示我的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2011-11-08
  • 2018-08-22
  • 2019-04-27
相关资源
最近更新 更多