#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, в которых в элементе списка более одного слова, например: «команда и я», он также разделил его на три объекта. например, «команда», «и»,»я».