-3

扱う文字列の 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)

1 番目と 2 番目の文字列でこれを使用すると、目的どおりに動作し、次の一致オブジェクトが返されます。

"<p>Money<br>Money<br>MORE MONEY</p>"

しかし、これを 3 番目の文字列で使用すると、次の一致オブジェクトが返されます。

"<p>They're great</p><p>Yield: KA-CHING</p><p>Money<br>Money<br>MORE MONEY</p>"

私は何を台無しにしていますか?


@ブレンダー

こんにちはブレンダー、これは私が欲しいチャンクをつかむために思いついたものです。もっと良い方法があると確信していますが、私が 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:]
4

1 に答える 1

3

適切な 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)
于 2013-08-21T16:38:30.457 に答える