Разделите элементы списка на значения, разделенные запятыми

#python #web-scraping #beautifulsoup

Вопрос:

Я новичок в веб-очистке и пытаюсь очистить неупорядоченный список. Я хочу, чтобы элементы списка были объединены в элементы списка, разделенные запятой. Это список, который я хочу наскрести.

 <div class="spec-list attributes-modality">
<h5 class="spec-subcat">Modality</h5>
<div class="col-split-xs-1 col-split-md-1">
<ul class="attribute-list copy-small">
<li class="">Individuals</li>
<li class="">Family</li>
<li class="">Group</li>
</ul></div></div>
 

Это моя попытка:

 modalitydiv = soup.find('div', class_='spec-list attributes-modality')
modality = modalitydiv.find('ul', class_='attribute-list copy-small').text.strip()
 

Моя попытка дает мне только список элементов списка строка за строкой.

Индивидуумы

Семья

Группа

Почему они не отображаются в одной строке и как я могу удалить элементы этого списка в список, разделенный запятыми? кто-нибудь может помочь, пожалуйста?

Ответ №1:

Я получаю следующий результат:

 from bs4 import BeautifulSoup


html_doc="""

<div class="spec-list attributes-modality">
<h5 class="spec-subcat">Modality</h5>
<div class="col-split-xs-1 col-split-md-1">
<ul class="attribute-list copy-small">
<li class="">Individuals</li>
<li class="">Family</li>
<li class="">Group</li>
</ul></div></div>

"""

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

p=', '.join([x.get_text(strip = True) for x in soup.select('ul.attribute-list.copy-small>li')])

print(p)
 

Выход:

 Individuals, Family, Group
 

Комментарии:

1. Это сработало при разделении элементов запятыми. Но все равно я получаю их в отдельных трех строках в csv-файле. Не в той же строке(в той же ). Между ними есть большие пространства. Trauma and PTSD , Addiction , Dual Diagnosis Подобный этому. Есть ли способ решить эту проблему?

2. @Devindi Siwurathna обновлено. Пробовать снова

3. Это сработало. Спасибо. Не могли бы вы, пожалуйста, объяснить мне, почему вы использовали «список атрибутов.копия-маленький» в качестве класса ul вместо «список атрибутов, копия-маленький»? в исходном классе ul есть пробел, и вы использовали точку. Не могли бы вы, пожалуйста, объяснить, почему это так? Или, пожалуйста, не могли бы вы предложить мне какой-нибудь ресурс?

4. Потому что ul содержит более одного значения класса. В селекторе css классы разделены пространством, поэтому, чтобы выбрать несколько классов, нам нужна точка, чтобы выбрать каждый класс, а не пробел. Спасибо

Ответ №2:

Что происходит

Вы используете strip() это только для удаления начальных и конечных символов.

Решение

Используйте split() вместо strip() этого для разделения строки на список:

 modalitydiv = soup.find('div', class_='spec-list attributes-modality')
modality = modalitydiv.find('ul', class_='attribute-list copy-small').text.split()
 

Выход

 ['Individuals', 'Family', 'Group']
 

Комментарии:

1. Это сработало для этой ул. Но когда я попробовал это для ul, в которых в элементе списка более одного слова, например: «команда и я», он также разделил его на три объекта. например, «команда», «и»,»я».