BeautifulSoup .children или .content без пробелов между тегами - PullRequest
0 голосов
/ 07 мая 2019

Я хочу, чтобы все дочерние элементы тега были без пробелов между тегами.Но BeautifulSoups .contents и .children также возвращает пробел между тегами.

html = """
<div id="list">
  <span>1</span>
  <a href="2.html">2</a>
  <a href="3.html">3</a>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
print(soup.find(id='list').contents)

Это печатает:

['\n', <span>1</span>, '\n', <a href="2.html">2</a>, '\n', <a href="3.html">3</a>, '\n']

То же самое с

print(list(soup.find(id='list').children))

ЧтоЯ хочу:

[<span>1</span>, <a href="2.html">2</a>, <a href="3.html">3</a>]

Есть ли способ сказать BeautifulSoup, чтобы он возвращал только теги и игнорировал пробелы?

Документация не очень полезна в этой теме,HTML в этом примере не содержит пробелов между тегами.

Действительно, удаление HTML всех пробелов решает мою проблему:

html = """<div id="list"><span>1</span><a href="2.html">2</a><a href="3.html">3</a></div>"""

Этот HTML доставляет теги без пробелов между тегами.Но я надеялся использовать BeautifoulSoup, поэтому мне не придется возиться с исходным кодом HTML.Я надеялся, что BeautifulSoup сделает это для меня.

Другой обходной путь может быть:

print(list(filter(lambda t: t != '\n', soup.find(id='list').contents)))

Но это кажется ненадежным, потому что пробел гарантированно всегда будет '\n'?


Примечание для дублирующей маркирующей бригады:

Существует множество вопросов, касающихся BeautifulSoup и пробелов.Большинство из них просят избавиться от пробелов из «отображаемого текста».

Например:

BeautifulSoup - избавиться от пробелов абзаца / разрывов строк

Удаление новой строки '\ n' из вывода python BeautifulSoup

Оба вопроса требуют текст без пробелов.Я хочу теги без пробелов.Решения там не относятся к моему вопросу.

Другой пример:

Регулярное выражение для класса с пробелами с использованием Beautifulsoup

Этот вопрос опробел в атрибуте класса.

1 Ответ

0 голосов
/ 07 мая 2019

BeautifulSoup имеет .find_all(True), который возвращает все теги без пробелов между тегами:

html = """
<div id="list">
  <span>1</span>
  <a href="2.html">2</a>
  <a href="3.html">3</a>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
print(soup.find(id='list').find_all(True))

Печать:

[<span>1</span>, <a href="2.html">2</a>, <a href="3.html">3</a>]

Объедините с recursive=False, и вы получите только прямых детей, а не детей от детей.

html = """
<div id="list">
  <span>1</span>
  <a href="2.html"><b>2</b></a>
  <a href="3.html">3</a>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
print(soup.find(id='list').find_all(True, recursive=False))

Печать:

[<span>1</span>, <a href="2.html"><b>2</b></a>, <a href="3.html">3</a>]

Общая информация: теперь, когда у меня есть решение, я нашел другой, казалось бы, не связанный вопрос и ответ в StackOverflow, где решение было скрыто в комментарии:

Почему BeautifulSoup .children содержит безымянные элементы, а также ожидаемый тег (ы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...