как отображать текст только с помощью find_all в красивом супе?

есть очень краткое решение для отображения текста из div с использованием красивого супа и find здесь https://stackoverflow.com/a/8994150/1063287 :

result = soup.find('div', {'class' :'flagPageTitle'}).text

я хочу применить ту же логику в сценарии, где:

content = original_content("div","class1 class2")

если я изменю это так:

content = original_content("div","class1 class2").text

я получаю сообщение об ошибке:

AttributeError: 'ResultSet' object has no attribute 'text'

может ли кто-нибудь сказать мне, как я могу использовать ту же логику, которая была показана изначально, но в сценарии, где я использую find_all, как указано выше? (обратите внимание, я использую ярлык find_all, который не предназначен для ввода, см. здесь)

Спасибо.


person user1063287    schedule 20.04.2013    source источник
comment
find_all возвращает список: попробуйте напечатать original_content("div","class1 class2", limit=1) и посмотрите, что появится.   -  person TerryA    schedule 20.04.2013
comment
Я думаю, это то, что я написал выше, я так понимаю, что find_all подразумевается, когда его опускают?   -  person user1063287    schedule 20.04.2013


Ответы (1)


Вы используете подразумеваемый метод .find_all() при непосредственном вызове элемента, который возвращает набор результатов (объект, подобный списку). Использование limit не меняет того, что возвращается, а только того, сколько возвращается.

Если вы хотите получить первый элемент этого набора, используйте нарезку:

original_content("div","class1 class2", limit=1)[0].text

или укажите это явно и используйте вместо этого .find():

original_content.find("div","class1 class2").text

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

[el.text for el in original_content("div","class1 class2")]
person Martijn Pieters    schedule 20.04.2013
comment
извините, спасибо за ваш ответ, я вижу, как limit=1 заставил вас думать, что мне нужен только один результат (он остался после тестирования, извините, я удалил его из кода выше), я хочу использовать find_all для найти все экземпляры «совпадения» и применить функцию «текст» ко всем из них. используя ваш пример, я попробовал original_content("div","class1 class2")[0:-1].text (надеясь применить его ко всем значениям в списке), но получил ошибку AttributeError: 'list' object has no attribute 'text'. - person user1063287; 20.04.2013
comment
Тогда вам все равно нужно будет перебрать все элементы; Я обновлю ответ. - person Martijn Pieters; 20.04.2013
comment
вау, это невероятно, я едва понимаю, круто! однако я обнаружил, что при печати (например, print content, где content — это имя объекта, которому было присвоено указанное выше понимание списка), вывод имеет u" перед первым значением, u' перед остальными значениями и, за исключением первое значение, каждое значение заканчивается '‹/div›' и другими тегами за пределами указанного div. поэтому кажется, что текст из указанных div не получается чисто. - person user1063287; 20.04.2013
comment
У вас есть список строк Unicode; BeautifulSoup полностью поддерживает Unicode. Вы хотите, чтобы .string получал просто прямое текстовое содержимое; .text превращает все, включая теги, в текст. - person Martijn Pieters; 20.04.2013
comment
content = [el.string for el in original_content("div","class1 class2")] , print content, отображает [None, None, None, None, None, None] - извините, это оказывается таким долгим процессом. - person user1063287; 20.04.2013
comment
Вы можете просмотреть документацию; тут больше вариантов. Например, .strings дает вам генератор для всего содержащегося текста. ''.join(el.strings) дает вам одну совокупную строку. - person Martijn Pieters; 20.04.2013
comment
Но вы можете задать новый вопрос с примерами входных данных и ожидаемых результатов вместе с вашими попытками. Этот вопрос исчерпал себя. - person Martijn Pieters; 20.04.2013