我正在尝试抓取一个食谱网站,但在尝试将字符串<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()
欢迎任何建议!
答案 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>