метод Python для извлечения контента (за исключением навигации) со страницы HTML
-
18-09-2019 - |
Вопрос
Конечно, HTML-страницу можно проанализировать с помощью любого количества парсеров Python, но я удивлен, что, похоже, не существует общедоступных сценариев синтаксического анализа для извлечения значимого контента (за исключением боковых панелей, навигации и т. д.) из данного HTML-документа. .
Я предполагаю, что это что-то вроде сбора элементов DIV и P с последующей проверкой их на минимальное количество текстового содержимого, но я уверен, что надежная реализация будет включать в себя множество вещей, о которых я не подумал.
Решение
Попробуйте Красивый суп библиотека для Python.Он имеет очень простые методы извлечения информации из html-файла.
Попытка извлечь данные из веб-страниц в общих чертах потребует от людей писать свои страницы аналогичным образом...но существует почти бесконечное количество способов передать страницу, которая выглядит идентично, не говоря уже о всех комбинациях, которые могут вам понадобиться для передачи одной и той же информации.
Был ли какой-то конкретный тип информации, который вы пытались получить, или какая-то другая конечная цель?
Вы можете попробовать извлечь любой контент с помощью маркеров «div» и «p» и сравнить относительные размеры всей информации на странице.Проблема в том, что люди, вероятно, группируют информацию в коллекции «div» и «p» (или, по крайней мере, так делают, если они пишут правильно сформированный HTML!).
Возможно, если бы вы сформировали дерево того, как связана информация (узлы были бы «p», «div» или что-то еще, и каждый узел содержал бы связанный текст), вы могли бы провести своего рода анализ, чтобы определить наименьшее «p» или « div', который содержит большую часть информации.?
[РЕДАКТИРОВАТЬ] Возможно, если вы сможете поместить это в предложенную мной древовидную структуру, вы сможете затем использовать аналогичную систему очков для спама убийц.Определите некоторые правила, которые пытаются классифицировать информацию.Некоторые примеры:
+1 points for every 100 words
+1 points for every child element that has > 100 words
-1 points if the section name contains the word 'nav'
-2 points if the section name contains the word 'advert'
Если у вас есть множество правил с низкой оценкой, которые суммируются, когда вы находите более релевантные разделы, я думаю, это может превратиться в довольно мощный и надежный метод.
[РЕДАКТИРОВАТЬ2] Судя по читаемости, кажется, что он делает именно то, что я только что предложил!Может быть, его можно улучшить, чтобы лучше понять таблицы?
Другие советы
Взгляните на шаблонизатор: http://www.holovaty.com/writing/templatemaker/
Он написан одним из основателей Django.По сути, вы передаете ему несколько примеров html-файлов, и он генерирует «шаблон», который затем можно использовать для извлечения только отличающихся битов (которые обычно являются значимым контентом).
Вот пример из кодовая страница гугла:
# Import the Template class.
>>> from templatemaker import Template
# Create a Template instance.
>>> t = Template()
# Learn a Sample String.
>>> t.learn('<b>this and that</b>')
# Output the template so far, using the "!" character to mark holes.
# We've only learned a single string, so the template has no holes.
>>> t.as_text('!')
'<b>this and that</b>'
# Learn another string. The True return value means the template gained
# at least one hole.
>>> t.learn('<b>alex and sue</b>')
True
# Sure enough, the template now has some holes.
>>> t.as_text('!')
'<b>! and !</b>'
Вы можете использовать Веб-приложение котловой трубы для извлечения и извлечения контента на лету.
(Это не относится только к Python, поскольку вам нужно всего лишь отправить HTTP-запрос GET на страницу в Google AppEngine).
Ваше здоровье,
христианин
Что имеет смысл, а что нет, зависит от семантики страницы.Если семантика дрянная, ваш код не будет «угадывать», что имеет смысл.Я использую читабельность, на которую вы ссылались в комментарии, и вижу, что на многих страницах, которые я пытаюсь прочитать, она не дает никакого результата, не говоря уже о достойном.
Если кто-то поместит содержимое в таблицу, вы обречены.Попробуйте читаемость на форуме phpbb, и вы поймете, что я имею в виду.
Если вы хотите это сделать, используйте регулярное выражение <p></p>
, или проанализировать DOM.
Гусь это просто библиотека для этой задачи.Процитирую их README:
Goose попытается извлечь следующую информацию:
- Основной текст статьи
- Основное изображение статьи
- Любые фильмы Youtube/Vimeo, встроенные в статью.
- Мета-описание
- Мета-теги