По сути, я хочу использовать BeautifulSoup для получения строго видимого текста на веб-странице. Например, эта веб-страница - мой тестовый пример. И в основном я хочу просто получить основной текст (статью) и, возможно, даже несколько названий вкладок здесь и там. Я пробовал предложение в этом вопросе SO, который возвращает множество <script>
тегов и комментариев html, которые мне не нужны. Я не могу понять, какие аргументы мне нужны для функции findAll()
, чтобы просто получить видимый текст на веб-странице.
Итак, как мне найти весь видимый текст, кроме скриптов, комментариев, CSS и т. Д.?
python
text
beautifulsoup
html-content-extraction
user233864
источник
источник
soup.findAll(text=True)
никогда не знал об этой особенностиisinstance(element, Comment)
а не совпадать с регулярным выражением.soup = BeautifulSoup(html)
elif isinstance(element,bs4.element.Comment):
. Я также добавил «мета» в список родителей.elif re.match(r"[\s\r\n]+",str(element)): return False
Утвержденный ответ от @jbochi у меня не работает. Вызов функции str () вызывает исключение, поскольку он не может кодировать символы, отличные от ascii, в элементе BeautifulSoup. Вот более лаконичный способ отфильтровать пример веб-страницы для отображения видимого текста.
источник
str(element)
у вас возникли проблемы с кодировкой, вы должны попробоватьunicode(element)
вместо этого, если используете Python 2.источник
<br>
теги\n
символами новой строки?Я полностью уважаю использование Beautiful Soup для получения визуализированного контента, но, возможно, это не идеальный пакет для получения визуализированного контента на странице.
У меня была аналогичная проблема с получением визуализированного контента или видимого контента в обычном браузере. В частности, у меня было много, возможно, нетипичных случаев для работы с таким простым примером, приведенным ниже. В этом случае неотображаемый тег вложен в тег стиля и не отображается во многих проверенных мной браузерах. Существуют и другие варианты, такие как определение для параметра отображения тега класса значения none. Затем используя этот класс для div.
Одно из решений, опубликованных выше:
Это решение, безусловно, имеет приложения во многих случаях и в целом выполняет свою работу достаточно хорошо, но в размещенном выше html оно сохраняет текст, который не отображается. После поиска SO здесь появилась пара решений BeautifulSoup get_text не удаляет все теги и JavaScript, а здесь визуализированный HTML в обычный текст с использованием Python
Я попробовал оба этих решения: html2text и nltk.clean_html и был удивлен результатами по времени, поэтому подумал, что они гарантируют ответ для потомков. Конечно, скорости сильно зависят от содержимого данных ...
Один из ответов здесь от @Helge касался использования nltk всего.
Очень хорошо получилось вернуть строку с визуализированным html. Этот модуль nltk был быстрее, чем даже html2text, хотя, возможно, html2text более надежен.
источник
Если вам важна производительность, вот еще один более эффективный способ:
soup.strings
является итератором, и он возвращается,NavigableString
чтобы вы могли напрямую проверить имя родительского тега, не повторяя несколько циклов.источник
Заголовок находится внутри
<nyt_headline>
тега, который вложен внутри<h1>
тега и<div>
тега с идентификатором «article».Должно сработать.
Тело статьи находится внутри
<nyt_text>
тега, который вложен в<div>
тег с идентификатором articleBody. Внутри<nyt_text>
элемента сам текст содержится в<p>
тегах. Изображения не попадают в эти<p>
теги. Мне сложно экспериментировать с синтаксисом, но я ожидаю, что рабочая царапина будет выглядеть примерно так.источник
Хотя я бы полностью предложил использовать красивый суп в целом, если кто-то хочет отображать видимые части искаженного html (например, где у вас есть только сегмент или строка веб-страницы) по какой-либо причине, следующие удалит содержимое между
<
и>
тегами:источник
Использование BeautifulSoup - самый простой способ с меньшим количеством кода, чтобы просто получить строки, без пустых строк и дерьма.
источник
Самый простой способ справиться с этим случаем - использовать
getattr()
. Вы можете адаптировать этот пример к своим потребностям:Он найдет текстовый элемент
"3.7"
в объекте тега,<span class="ratingsContent">3.7</span>
если он существует, однако по умолчанию используется,NoneType
когда его нет.источник
источник