Как разбить строку на основе тега <br>с помощью Beautifulsoup - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь очистить веб-сайт с рецептами и испытываю трудности, пытаясь разделить строку на разные предложения после тега <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 голосов
/ 25 апреля 2019

Вы можете использовать .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
0 голосов
/ 25 апреля 2019

что-то вроде этого может быть?

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>
0 голосов
/ 25 апреля 2019

Вы можете использовать следующее выражение для разделения всех ингредиентов внутри тега 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'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...