SOUP, XML

Description: Программирование на супер модном мега крутом языке Питон.

dyvniy M
Topic author, Администратор
Администратор
Avatar
dyvniy M
Topic author, Администратор
Администратор
Age: 39
Reputation: 1
Loyalty: 1
Posts: 3472
Joined: Wed, 10 Oct 2012
With us: 9 years 3 months
Профессия: Программист
Location: Россия, Москва
ICQ Website Skype VK

#1by dyvniy » Tue, 26 Sep 2017, 15:26:35

Данный мануал научит работать с пакетами Requests и Beautiful Soup для использования данных с веб-страниц.
https://www.8host.com/blog/rabota-s-veb-dannymi-s ... s-i-beautiful-soup-v-python-3/
Spoiler
РАБОТА С ВЕБ-ДАННЫМИ С ПОМОЩЬЮ REQUESTS И BEAUTIFUL SOUP В PYTHON 3
Август 12, 2017 12:08 пп 207 views | Комментариев нет
Python | Amber | 0 Comments

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

Данный мануал научит работать с пакетами Requests и Beautiful Soup для использования данных с веб-страниц. Модуль Requests позволяет интегрировать программы Python с веб-сервисами, а модуль Beautiful Soup предназначен для ускорения анализа экранных данных. С помощью интерактивной консоли Python и этих библиотек можно проанализировать веб-страницу и работать с имеющейся там текстовой информацией.

Требования

Вам понадобится среда разработки Python 3. Чтобы создать такую среду, можно воспользоваться руководствами Настройка локальной среды разработки для Python 3 в Ubuntu 16.04 или Установка Python 3 и настройка среды разработки на сервере Ubuntu 16.04.

Также рекомендуем ознакомиться со следующими статьями:

Использование интерактивной консоли Python
Импорт модулей в Python 3
Кроме того, вам нужно иметь базовые знания о структурах и тегах HTML.

Установка Requests

Разверните среду программирования Python 3. Убедитесь, что вы находитесь в каталоге, в котором находится ваша среда, и выполните следующую команду:

. my_env/bin/activate

Чтобы работать с веб-страницами, их нужно будет запрашивать. Библиотека Requests позволяет использовать HTTP в своих программах Python.

Установите Requests в среду программирования.

pip install requests
Collecting requests
Downloading requests-2.18.1-py2.py3-none-any.whl (88kB)
100% |████████████████████████████████| 92kB 3.1MB/s
...
Installing collected packages: chardet, urllib3, certifi, idna, requests
Successfully installed certifi-2017.4.17 chardet-3.0.4 idna-2.5 requests-2.18.1 urllib3-1.21.1

Если библиотека Requests была установлена ранее, вы получите такой вывод:

Requirement already satisfied
...

Установка Beautiful Soup

Теперь нужно установить Beautiful Soup с помощью pip. На данный момент последней версией является Beautiful Soup 4.

pip install beautifulsoup4

Команда выведет:

Collecting beautifulsoup4
Downloading beautifulsoup4-4.6.0-py3-none-any.whl (86kB)
100% |████████████████████████████████| 92kB 4.4MB/s
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.0

Теперь можно приступать к работе с библиотеками.

Сбор данных веб-страницы с помощью Requests

С помощью этих двух библиотек Python, можно проанализировать веб-страницу.

Перейдите в Python Interactive Console:

python

Читайте также: Использование интерактивной консоли Python

Импортируйте модуль Requests, чтобы собрать данные с веб-страницы:

import requests

Присвойте URL-адрес тестовой страницы (в данном случае это mockturtle.html) переменной url.

url = 'https://assets.digitalocean.com/articles/eng_python/beautiful-soup/mockturtle.html'

Затем можно присвоить результат запроса этой страницы переменной page с помощью метода request.get(). Передайте URL-адрес страницы, который был присвоен переменной url, этому методу.

page = requests.get(url)

Переменная page присвоена объекту Response.

>>> page
<Response [200]>
>>>

Объект Response сообщает свойство status_code в квадратных скобках (в данном случае это 200). Этот атрибут можно вызвать явно:

>>> page.status_code
200
>>>

Возвращаемый код 200 сообщает, что страница загружена успешно. Коды, начинающиеся с номера 2, обычно указывают на успешное выполнение операции, а коды, начинающиеся с 4 или 5, сообщают об ошибке. Вы можете узнать больше о кодах состояния HTTP по этой ссылке.

Чтобы работать с веб-данными, нужно получить доступ к текстовому содержимому веб-файлов. Прочитать содержимое ответа сервера можно с помощью page.text (или page.content, чтобы получить значение в байтах).

page.text

Нажмите Enter.

'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n\n<html lang="en-US"
xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">\n<head>\n <meta
http-equiv="content-type" content="text/html; charset=us-ascii" />\n\n <title>Turtle
Soup</title>\n</head>\n\n<body>\n <h1>Turtle Soup</h1>\n\n <p class="verse"
id="first">Beautiful Soup, so rich and green,<br />\n Waiting in a hot tureen!<br />\n Who for
such dainties would not stoop?<br />\n Soup of the evening, beautiful Soup!<br />\n Soup of
the evening, beautiful Soup!<br /></p>\n\n <p class="chorus" id="second">Beau--ootiful
Soo--oop!<br />\n Beau--ootiful Soo--oop!<br />\n Soo--oop of the e--e--evening,<br />\n
Beautiful, beautiful Soup!<br /></p>\n\n <p class="verse" id="third">Beautiful Soup! Who cares
for fish,<br />\n Game or any other dish?<br />\n Who would not give all else for two<br />\n
Pennyworth only of Beautiful Soup?<br />\n Pennyworth only of beautiful Soup?<br /></p>\n\n
<p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br />\n Beau--ootiful Soo--oop!<br />\n
Soo--oop of the e--e--evening,<br />\n Beautiful, beauti--FUL SOUP!<br
/></p>\n</body>\n</html>\n'
>>>

Полный текст страницы был отображен со всеми тегами HTML. Однако его трудно прочитать, поскольку между ними не так много пробелов.

Анализ веб-данных с помощью Beautiful Soup

Библиотека Beautiful Soup создает дерево синтаксического разбора из проанализированных HTML и XML-документов (включая документы с открытыми тегами, tag soup и неправильной разметкой). Эта библиотека сделает текст веб-страницы, извлеченный с помощью Requests, более удобочитаемым.

Импортируйте Beautiful Soup в консоль Python.

from bs4 import BeautifulSoup

Затем нужно запустить обработку документа page.text, чтобы получить объект BeautifulSoup, то есть дерево синтаксического разбора этой страницы, полученной с помощью встроенного html.parser через HTML. Построенный объект представляет документ mockturtle.html как вложенную структуру данных, которая присваивается переменной soup.

soup = BeautifulSoup(page.text, 'html.parser')

Чтобы отобразить содержимое страницы в терминале, используйте метод prettify(), который превратить дерево разбора Beautiful Soup в красиво отформатированную строку Unicode.

print(soup.prettify())
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
<title>
Turtle Soup
</title>
</head>
<body>
<h1>
Turtle Soup
</h1>
<p class="verse" id="first">
Beautiful Soup, so rich and green,
<br/>
Waiting in a hot tureen!
<br/>
Who for such dainties would not stoop?
<br/>
Soup of the evening, beautiful Soup!
...
</html>

В вышеприведенном выводе все теги размещены в отдельных строках. Теги вложены из-за схемы дерева, которую использует Beautiful Soup.

Поиск экземпляров тега

Извлечь один тег со страницы можно с помощью метода find_all. Он вернет все экземпляры данного тега в документе.

soup.find_all('p')

Применив этот метод, вы получите полный текст с соответствующими тегами <p> и любыми тегами, содержащимися в этом запрошенном теге (например, тег <br/>).

[<p class="verse" id="first">Beautiful Soup, so rich and green,<br/>
Waiting in a hot tureen!<br/>
Who for such dainties would not stoop?<br/>
Soup of the evening, beautiful Soup!<br/>
Soup of the evening, beautiful Soup!<br/></p>, <p class="chorus" id="second">Beau--ootiful Soo--oop!<br/>
...
Beau--ootiful Soo--oop!<br/>
Soo--oop of the e--e--evening,<br/>
Beautiful, beauti--FUL SOUP!<br/></p>]

В выводе вы увидите, что данные содержатся в квадратных скобках []. Этот тип данных Python называется списками.

Читайте также: Работа со списками в Python 3

Вы можете вызвать определенный элемент списка (например, третий элемент <p>) и использовать метод get_text () для извлечения всего текста из этого тега:

soup.find_all('p')[2].get_text()
'Beautiful Soup! Who cares for fish,\n Game or any other dish?\n Who would not give all else for two\n Pennyworth only of Beautiful Soup?\n Pennyworth only of beautiful Soup?'

Обратите внимание, что разрывы строк \n также показаны в возвращаемой строке.

Поиск тегов по классам и ID

Элементы HTML, относящиеся к селекторам CSS, такие как класс и ID, могут быть полезны при работе с веб-данными и Beautiful Soup. Настроить целевые классы и ID можно с помощью метода find_all(), передав ему строки класса и ID в качестве аргументов.

Попробуйте найти все экземпляры класса chorus. В Beautiful Soup присвойте строку класса ключевому слову class_:

soup.find_all(class_='chorus')
Запустите эту строку, и вы увидите:
[<p class="chorus" id="second">Beau--ootiful Soo--oop!<br/>
Beau--ootiful Soo--oop!<br/>
Soo--oop of the e--e--evening,<br/>
Beautiful, beautiful Soup!<br/></p>, <p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br/>
Beau--ootiful Soo--oop!<br/>
Soo--oop of the e--e--evening,<br/>
Beautiful, beauti--FUL SOUP!<br/></p>]

Две секции <p>-с классом chorus появятся на терминале.

Также можно указать, что класс chorus нужно искать только в тегах <p>, если он используется для нескольких тегов:

soup.find_all('p', class_='chorus')

Запустите эту строку, и вы получите тот же вывод, что и раньше.

Также можно использовать Beautiful Soup для поиска целевых идентификаторов, связанных с тегами HTML. Попробуйте присвоить строку third ключевому слову id:

soup.find_all(id='third')
[<p class="verse" id="third">Beautiful Soup! Who cares for fish,<br/>
Game or any other dish?<br/>
Who would not give all else for two<br/>
Pennyworth only of Beautiful Soup?<br/>
Pennyworth only of beautiful Soup?<br/></p>]

Текст, связанный с тегом <p> идентификатором third, выводится в терминал вместе с соответствующими тегами.

Заключение

В этом мануале вы научились извлекать данные веб-страницы с помощью модуля Requests и выполнять предварительный scraping текстовых данных этой веб-страницы с помощью библиотеки Beautiful Soup.
Image

dyvniy M
Topic author, Администратор
Администратор
Avatar
dyvniy M
Topic author, Администратор
Администратор
Age: 39
Reputation: 1
Loyalty: 1
Posts: 3472
Joined: Wed, 10 Oct 2012
With us: 9 years 3 months
Профессия: Программист
Location: Россия, Москва
ICQ Website Skype VK

#2by dyvniy » Fri, 14 Sep 2018, 18:45:10

xmlns
https://www.artlebedev.ru/technogrette/xslt/xmlns-1/
Spoiler
Про xmlns. Часть первая
HTML и CSSXSLTJavaScriptИзображенияСофтEtc

Александр Самиляк
14 июня 2011

Задача.
Рассказать о неймспейсах в XSLT.



Корневым элементом XSL-шаблона является <xsl:stylesheet>, и во многих случаях он выглядит так:

<xsl:stylesheet
version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
...
</xsl:stylesheet>
Атрибут version является обязательным, равно как и объявление XSL-неймспейса xmlns:xsl="http://www.w3.org/1999/XSL/Transform" (иначе было бы неясно, где в шаблоне сам XSL-код). А вот зачем нам нужна запись xmlns="http://www.w3.org/1999/xhtml", не очень понятно.


Для начала уясним, что вообще делают эти конструкции, начинающиеся с xmlns. У всесильного W3C на эту тему тоже есть свой документ, озаглавленный «Неймспейсы в XML». Почитав его (перед сном это делать не рекомендуется), мы узнаем, что основной причиной возникновения неймспейсов явилась необходимость отличать XML-элементы, обладающие одним и тем же именем, но имеющие разный смысл и предназначение, относящиеся к разным словарям разметки.

Хорошим примером такого разделения может служить как раз милый нашему сердцу XSL. Скажем, элемент <xsl:text> имеет неймспейс xsl и является управляющим XSL-кодом, тогда как элемент <text> неймспейса не имеет и просто отправляется на вывод, несмотря на то что имя у него тоже text.

Чтобы использовать какой-то неймспейс в своем XML (а XSL есть XML), его надо сначала объявить. Продолжая изучать вышеозначенный документ, мы обнаруживаем, что существуют два способа объявления неймспейсов: с префиксом и без префикса.

Форма с префиксом имеет вид:

xmlns : префикс = "полный URI"
Здесь префикс — это некоторое внутреннее имя нашего XML-документа, мы можем использовать любой префикс, какой нам нравится. А вот URI — это такая штука, которая фиксируется раз и навсегда, чтобы при виде этого URI все понимали, какой словарь разметки он представляет. Скажем, написал кто-то на заборе http://www.w3.org/1999/XSL/Transform, и каждому ясно — да это же URI XSL-я! Понятно, что при таком подходе все URI должны быть уникальны.

Следует также понимать, что XML-процессоры не «ходят» в интернет, чтобы по этому адресу чего-то скачать. Это всего лишь уникальный идентификатор. Однако здесь возникает вопрос: а что же он тогда выглядит как адрес в интернете? Почему вместо http://www.w3.org/1999/XSL/Transform не писать, например, «у-вас-ус-отклеился»? Ответ прост: когда-то условились, что по этому адресу URI в интернете должна висеть маленькая страничка, в двух словах рассказывающая, что это за URI и какой цели служит. И страничка эта предназначена для человека, а не для машины.


Итак, объявив неймспейс с префиксом, мы теперь можем его использовать — писать элементы, имеющие этот неймспейс. Как это делать, читатель наверняка знает:

<префикс : имя элемента>
Ровно так все делают в XSL-коде, когда хотят использовать какой-то XSL-элемент, например <xsl:template>. Как я уже сказал, префикс может быть любым, поэтому можно писать и так:

<god_bless_america:stylesheet
version="1.0"
xmlns:god_bless_america="http://www.w3.org/1999/XSL/Transform"
>

<god_bless_america:template match="/">
...
</god_bless_america:template>

</god_bless_america:stylesheet>
Но все привыкли использовать xsl — это коротко и удобно.


Переходим к неймспейсу без префикса. Он имеет вид:

xmlns = "полный URI"
Эта конструкция объявляет неймспейс по умолчанию. Он нужен в ситуации, когда при написании элемента мы не указываем префикс, а пишем сразу имя элемента — <div>. То есть элемент, не имеющий префикса, считается принадлежащим к неймспейсу по умолчанию.

А что если неймспейс по умолчанию не объявлен и у элемента нет префикса? Такую ситуацию вэтрицэшники тоже регламентируют: тогда элемент получит неймспейс, не имеющий значения, который называется null.


Следовательно, запись xmlns="http://www.w3.org/1999/xhtml" в начале XSL-шаблона нужна для того, чтобы сообщить XSL-процессору (трансформатору), что все элементы, не имеющие префикса, относятся к этому неймспейсу XHTML-документов. А что это дает? Самое смешное, что ничего особенного.

Все, что произойдет, — это копирование указанного неймспейса в выходной HTML. То есть такой XSL-шаблон:

<xsl:stylesheet
version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:template match="/">
<html>
<body>
<p>Дизайн спасет мир</p>
</body>
</html>
</xsl:template>

</xsl:stylesheet>
выведет следующее:

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<p>Дизайн спасет мир</p>
</body>
</html>
Это, конечно, круто, и этого даже требует XHTML-спецификация, но в жизни от этого ни холодно ни жарко. Другое замеченное изменение в поведении трансформатора: если выставлен <xsl:output method="html" />, то при отсутствии неймспейса по умолчанию выходят незакрытые теги (<br>). Но при xmlns="http://www.w3.org/1999/xhtml" теги начинают закрываться. Однако если кто-то думает, что сайт с валидным HTML работает лучше, чем с невалидным, то ему самое время встать и выйти. Меня это сильно раздражает, ведь сайты делаются для людей, а не для валидатора.

Итак, берусь утверждать, что при выводе HTML ощутимой пользы от этого xmlns="http://www.w3.org/1999/xhtml" нет. А есть ли вред? Оказывается, небольшой есть — от неаккуратного использования.

Трансформаторы обязаны копировать xmlns в выходной HTML по XSL-спецификации. Дело в том, что трансформатор может генерировать не только HTML, но и произвольный XML (который может быть подвергнут дальнейшей машинной обработке), и в нем нужно сообщить, какому неймспейсу принадлежат элементы, не имеющие префикса. Причем в этом месте действуют определенные правила. В частности, запись:

<html xmlns="http://www.w3.org/1999/xhtml">
...
</html>
говорит, что текущий элемент <html> и все его потомки, не имеющие префикса, относятся к неймспейсу http://www.w3.org/1999/xhtml. Это важно. Именно из-за этого в HTML регулярно вылезают эти записи xmlns="http://www.w3.org/1999/xhtml".

Разберемся на примере. Представим, что у нас есть два XSL-шаблона, причем один импортирует другой.

Главный шаблон:

<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:import href="import.xsl" />

<xsl:template match="/">
<html>
<head>
<title>Billie Jean</title>
</head>
<body>
<xsl:call-template name="lyrics" />
</body>
</html>
</xsl:template>

</xsl:stylesheet>
Импортируемый шаблон import.xsl:

<xsl:stylesheet
version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:template name="lyrics">
<p>Billie Jean is not my lover</p>
<p>She's just a girl who claims that I am the one</p>
<p>But the kid is not my son</p>
</xsl:template>

</xsl:stylesheet>
Результатом выполнения главного шаблона будет:

<html>
<head>
<title>Billie Jean</title>
</head>
<body>
<p xmlns="http://www.w3.org/1999/xhtml">Billie Jean is not my lover</p>
<p xmlns="http://www.w3.org/1999/xhtml">She's just a girl who claims that I am the one</p>
<p xmlns="http://www.w3.org/1999/xhtml">But the kid is not my son</p>
</body>
</html>
Почему посреди нашего HTML вылезли эти xmlns="http://www.w3.org/1999/xhtml", да еще три раза?

Сначала главный шаблон выводит элементы <html>, <head> и <body>. В главном шаблоне нет объявления неймспейса по умолчанию (он null), поэтому никаких xmlns у элемента <html> тоже нет. Но дальше внутри <body> вызывается шаблон name="lyrics", который находится в другом файле import.xsl. И вот у негó уже есть объявление неймспейса по умолчанию, которое действует на все элементы, выводимые в коде этого файла import.xsl. Поэтому при выводе абзацев <p> нам и сообщается, что у них неймспейс http://www.w3.org/1999/xhtml, иначе они примут неймспейс своего родителя <body>, который равен null. Это произошло с каждым абзацем, так как они вышли братьями.


Рассмотрим обратную ситуацию, когда в главном шаблоне есть xmlns="http://www.w3.org/1999/xhtml", а в импортируемом — нет. Тогда на выходе мы получим другой сюрприз:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Billie Jean</title>
</head>
<body>
<p xmlns="">Billie Jean is not my lover</p>
<p xmlns="">She's just a girl who claims that I am the one</p>
<p xmlns="">But the kid is not my son</p>
</body>
</html>
Элемент <html> и все его потомки законно получают XHTML-неймспейс. Но у абзацев-то он null (ибо в их файле import.xsl xmlns не указан), поэтому абзацы бунтуют и говорят нам: «Идите к черту. Не хотим наследовать ваш XHTML. У нас свой неймспейс null». Это выражается в записи xmlns="" у каждого абзаца, которая как раз и означает, что неймспейс этого элемента null.


Вывод: надо или во всех XSL-файлах объявлять неймспейс по умолчанию, или во всех не объявлять. Лично я везде не объявляю — меньше суеты в коде.


В следующей части мы подробнее разберемся в неймспейсах с префиксом.
https://stackoverflow.com/questions/14853243/pars ... pace-in-python-via-elementtree

В который раз убеждаюсь в мудрости старших:
https://docs.python.org/3/library/xml.etree.elementtree.html
xml.etree.ElementTree.register_namespace(prefix, uri)
Порадовал Дмитрий Акендинов - он настоящий технарь!
При чём я читал этот документ, но видеть недостаточно внимательно.
Image

dyvniy M
Topic author, Администратор
Администратор
Avatar
dyvniy M
Topic author, Администратор
Администратор
Age: 39
Reputation: 1
Loyalty: 1
Posts: 3472
Joined: Wed, 10 Oct 2012
With us: 9 years 3 months
Профессия: Программист
Location: Россия, Москва
ICQ Website Skype VK

#3by dyvniy » Wed, 19 Sep 2018, 18:14:49

Why I have chosen simplest one?
https://docs.python.org/3/library/xml.html
May be other are better.

Code: Select all

xml.etree.ElementTree: 'the ElementTree API, a simple and lightweight XML processor'
xml.dom: 'the DOM API definition'
xml.dom.minidom: 'a minimal DOM implementation'
xml.dom.pulldom: 'support for building partial DOM trees'
xml.sax: 'SAX2 base classes and convenience functions'
xml.parsers.expat: 'the Expat parser binding' 
Image


Forum name: Python
Description: Программирование на супер модном мега крутом языке Питон.

Quick reply


Enter the code exactly as it appears. All letters are case insensitive.
Confirmation code
:) ;) :hihi: :P :hah: :haha: :angel: :( :st: :_( :cool: 8-| :beee: :ham: :rrr: :grr: :* :secret: :stupid: :music: View more smilies
   

Return to “Python”

Who is online (over the past 15 minutes)

Users browsing this forum: 1 guest