Python Beautiful Soup печатает определенные строки в многострочном <p>, содержащем строку - PullRequest
0 голосов
/ 13 ноября 2018

Как я могу получить / напечатать только строки большого многострочного текста в одном теге <p>, содержащем определенную строку?На сайте строки реализованы с тегами <br>.Закрывающего тега </p> нет.

Основная структура сайта:

<p style="line-height: 150%">
I need a big cup of coffee and cookies.
<br>
I do not like tea with milk.
<br>
I can't live without coffee and cookies.
<br>
...

Предположим, я хочу получить / напечатать только строки, содержащие слова «кофе и печенье».Таким образом, в этом случае должна быть напечатана только первая и третья «строка» / предложение этого <p>.

У меня установлен Beautiful Soup 4.6.3 под Python 3.7.1.

findAll, кажется, ориентирован на теги и возвращает целое <p>, верно?Так как я могу это понять?Может быть с регулярным выражением или другим шаблоном?

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Если бы я мог правильно понять ваше требование, то следующий фрагмент должен привести вас туда:

from bs4 import BeautifulSoup

htmlelem = """
    <p style="line-height: 150%">
    I need a big cup of coffee and cookies.
    <br>
    I do not like tea with milk.
    <br>
    I can't live without coffee and cookies.
    <br>
"""

soup = BeautifulSoup(htmlelem, 'html.parser')
for paragraph in soup.find_all('p'):
    if not "coffee and cookies" in paragraph.text:continue
    print(paragraph.get_text(strip=True))
0 голосов
/ 14 ноября 2018

Можете ли вы разделить на \ n?

from bs4 import BeautifulSoup

html = """
    <p style="line-height: 150%">
    I need a big cup of coffee and cookies.
    <br>
    I do not like tea with milk.
    <br>
    I can't live without coffee and cookies.
    <br>
"""

soup = BeautifulSoup(html, 'html.parser')
for item in soup.select('p'):
    r1 = item.text.split('\n')
    for nextItem in r1:
        if "coffee and cookies" in nextItem:
            print(nextItem)
0 голосов
/ 13 ноября 2018

конвертировать bs4.element в строку, используя str(), затем вы можете сравнить ее с "кофе и печенье"

from bs4 import BeautifulSoup

html_doc = """<p style="line-height: 150%">
    I need a big cup of coffee and cookies. <a href="aaa">aa</a>
    <br>
    I do not like tea with milk.
    <br>
    I can't live without coffee and cookies.
    <br>"""

soup = BeautifulSoup(html_doc, 'html.parser')
paragraph = soup.find('p')

for p in paragraph:
  if 'coffee and cookies' in str(p):
    next_is_a = p.find_next_sibling('a')
    if next_is_a:
      print(p.strip() + ' ' + str(next_is_a))
    else:
      print(p.strip())
...