Как найти шрифт и цвет для каждого текста в Python веб-парсинге? - PullRequest
1 голос
/ 29 мая 2020

Я написал парсер Python, который может очищать текст с веб-сайтов, и теперь я нахожусь в процессе маркировки шрифта и размера. Например, CSS:

td{ font-family:Arial; font-size:9pt; }
hr { height:1px; }
.currency { color:#000099; }

HTML:

<td align="left">
<font class="currency">USD</font>
"3.20"
</td>

Мой желаемый результат:

{
"text": ["USD", "3.20"],
"font": ["Arial", "Arial"],
"colours": ["#000099", "#000000"],
}

Могу ли я как-нибудь сделать это с BeautifulSoup или регулярным выражением?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Есть ли способ сделать это с помощью BeautifulSoup или regex ?

Да и нет, но это, вероятно, больше работы, чем ее ценность, и не пуленепробиваемая , поэтому я склоняюсь к нет. Если вы используете только beautifulsoup и хотите знать, какие стили применяются к элементу, как если бы вы использовали браузер, тогда это сложно.

Вам нужно добавить в микс некоторые другие инструменты, такие как безголовый браузер.

Сохранение настроек

HTML + CSS

Во-первых, немного фона.

HTML - это сам документ , тот, который содержит информацию, которую можно анализировать и преобразовывать. И это то, что у вас есть в вашей программе.

CSS - это просто что-то, созданное для браузеров и для людей. Его цель - сделать документ красивее, понятнее и проще в использовании. Чтобы получить более широкое представление о том, как CSS используется браузером, посмотрите эту Как работает CSS статья MDN . Это означает, что стили загружаются отдельно и применяются «во время выполнения» в браузере. Также существует по крайней мере три различных способа указать стили для элемента (отдельные документы, встроенный и т. Д. c).

парсинг

Я полагаю, вы используете что-то вроде requests для загрузки страницу, затем отправьте ее на beautifulsoup, а затем выберите оттуда любые данные, которые вам нужны. Чтобы использовать эту диаграмму из статьи, у вас есть первые три поля из верхнего ряда, то есть без загрузки или анализа CSS и без отображения страницы.

Это также относится к любым манипуляциям с DOM это происходит в браузере после загрузки страницы, например, контент, загружаемый динамически через вызовы API, или любой JS, который изменяет страницу - вы не сможете поймать их в конвейере requests - beautifulsoup.

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

DIY

Во-первых, вы можете получить атрибут style элемента (td['style']) и проанализируйте это для шрифтов. Обратите внимание, что есть несколько способов указать это, например, font: italic 1.2em "Fira Sans", serif;, font: small-caps bold 24px/1 sans-serif;, font-family: 'Fira Sans', serif; font-size: 1.2em;. Но тогда есть также каскадная часть CSS, что означает, что родительский элемент может применять стили к своим дочерним элементам.

Затем в документе есть теги <style>, а также <link rel="stylesheet">.

Дело в том, что это работа, выполняемая браузером (и к тому же сложная задача!), Вы бы частично копировали ее, и есть другие вещи, которые вы могли бы использовать.

Headless browser

У этой работы есть имя, и вот оно. Это означает, что это реализация браузера без фактического GUI, которую вы можете использовать программно через API. Это делает его отличным, например, для тестирования веб-сайтов, а также для очистки страниц с динамическим c контентом или для которых вам нужна информация о стиле.

Я не могу рекомендовать их, так как сам не использовал их , но этого должно быть достаточно, чтобы вы начали.

0 голосов
/ 30 мая 2020

После некоторых размышлений я пришел к решению, хотя оно не изящно, оно работало нормально: 1. Разберите css с помощью регулярного выражения и создайте словарь с классами и стилями 2. Итерируйте по словарю и используйте метод выбора beautifulsoup для внедрения маркировка строки html, например:

original:
>>> <b>some text</b>
inject labels:
bs4_object.string = bs4_object.text + label
>>> <b>some[[bold]] text[[bold]]</b>
Используйте bs4, чтобы извлечь весь текст, затем проанализируйте метки в список
...