如何使用beautifulsoup根据<br/>标记分割字符串

时间:2019-04-25 11:51:08

标签: python regex web-scraping beautifulsoup

我正在尝试抓取一个食谱网站,但在尝试将字符串<br>之后分成不同的句子时遇到麻烦。

为了更好地理解该问题,我将向您展示我正在谈论的代码和输出。

以下是我正在处理的HTML代码段。

<div class="opskriften">
          <p class="h3">Ingrediensliste</p>
          <p></p>
<p>100 g. mælkechokolade<br>20 g. mini marshmallows<br>40 g. saltede peanuts</p>
<p>

        </p></div>

我想以某种方式分隔<br>标记之后的每种成分,以便进一步分离字符串,以便最终获得具有3个不同列(量,单位,成分)的表。以下代码是我用来获取某些<p>标签的代码。

from bs4 import BeautifulSoup
    import requests 
    r = requests.get("site")
    soup = BeautifulSoup(r.content)
    ingredients = soup.find('div', class_='opskriften')
    ingredientslist = ingredients.select_one("p:nth-oftype(2)")
    print(ingredientslist)

输出如下:

<p>100 g. mælkechokolade<br/>20 g. mini marshmallows<br/>40 g. saltede peanuts</p>

如何分隔这些成分,以便随后可以应用正则表达式来匹配所有内容并将其放在如上所述的正确列中?

我尝试使用正则表达式,如下所示,但是我得到了AttributeError: 'NoneType' object has no attribute 'groups',所以我想我需要将它们分开才能正确应用。

pattern_text=r'(?P<amount>\d+):\s+(?P<unit>\w+):\s+(?P<ingredient>\w+)'
pattern=re.compile(pattern_text)

match=pattern.match(ingredientslist)
match.groups()

欢迎任何建议!

3 个答案:

答案 0 :(得分:0)

您可以使用以下表达式来分隔p标记内的所有成分,并根据需要使用groupdict函数输出为key:value对:

import re

s = "<p>100 g. mælkechokolade<br/>20 g. mini marshmallows<br/>40 g. saltede peanuts</p>"
r = re.compile(r"(?P<amount>\d+)\s+(?P<unit>\w+.)\s+(?P<ingredient>.+?(?=<))")

print([m.groupdict() for m in r.finditer(s)])

#[{'amount': '100', 'unit': 'g.', 'ingredient': 'mælkechokolade'}, {'amount': '20', 'unit': 'g.', 'ingredient': 'mini marshmallows'}, {'amount': '40', 'unit': 'g.', 'ingredient': 'saltede peanuts'}]

答案 1 :(得分:0)

您可以将.get_text()separator参数一起使用:

from bs4 import BeautifulSoup

html = '''<div class="opskriften">
          <p class="h3">Ingrediensliste</p>
          <p></p>
<p>100 g. mælkechokolade<br>20 g. mini marshmallows<br>40 g. saltede peanuts</p>
<p>

        </p></div>'''


soup = BeautifulSoup(html, 'html.parser')

ingredients = soup.find('div', class_='opskriften')

print (ingredients.get_text(separator=" ").strip())

输出:

Ingrediensliste 

 100 g. mælkechokolade 20 g. mini marshmallows 40 g. saltede peanuts

答案 2 :(得分:0)

也许是这样吗?

a = "<p>100 g. mælkechokolade<br>20 g. mini marshmallows<br>40 g. saltede peanuts</p>" print(a.replace("<br>"," "))

并输出:

<p>100 g. mælkechokolade 20 g. mini marshmallows 40 g. saltede peanuts</p>