KL
Konstantin LazarevMay 13, 2017, 12:06 p.m.

Аналог jsoup для Qt

Доброе утро, подскажите пожалуйста, в Qt есть аналог библиотеки jsoup. Библиотека позволяет доставать любые теги из спарсеного документа.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

16
Evgenii Legotckoi
  • May 13, 2017, 12:20 p.m.

Добрый день!

Если только на гитхабе кто-нибудь выложил нечто подобное, поскольку такая библиотека, если бы она была, была бы очень известна.

А так могу предложить варианты либо с QXmlStreamReader , QXmlStreamWriter , либо с QDomDocument .

Впрочем, настоятельно рекомендую обратить внимание на QDomDocument , там есть методы по получению тегов по имени или id.

Если бы Вы писали на PyQt5, то я порекомендовал бы ещё обратить внимание на Python библиотеку BeautifulSoup 4 , она очень хороша, несмотря на немного неочевидные некоторые моменты в работе. У меня на сайте комментарии и ответы на форуме именно этой библиотекой обрабатываются перед публикацией. Но QDomDocument вполне себе реализует необходимый функционал по извлечению необходимых тегов, разве только нет методов, которые бы по классам или атрибутам выдёргивали необходимые теги, но можно в цикле запросто найти нужный тег из QDomNodeList .

    KL
    • May 13, 2017, 12:35 p.m.

    Можно пару строк кода, для лучшего понимания, как вытащить только title из спарсеного документа.

      Evgenii Legotckoi
      • May 13, 2017, 12:37 p.m.

      Можно, но только покажите, как у вас тег title выглядит в HTML документе.

        Evgenii Legotckoi
        • May 13, 2017, 6:02 p.m.

        Так. Ну я увидел, как выглядит этот тег в логах об ошибке. Накидаю пример.
        В следующий раз, просьба, вставлять HTML код через диалог вставки кода. (Надо будет подумать, как пофиксить этот баг)

          Evgenii Legotckoi
          • May 13, 2017, 6:46 p.m.

          Допустим тогда, есть вот такой кусок HTML кода:

          <!DOCTYPE html>
          <html>
             <head>
                <title>
                   A Small Hello
                </title>
             </head>
          <body>
             <h1>Hi</h1>
             <p>This is very minimal "hello world" HTML document.</p>
          </body>
          </html>

          Следовательно, нужно получить текст, который содержится в title . Для этого в pro файле необходимо подключить модуль xml

          QT += xml

          И воспользоваться возможностями QDomDocument

          QDomDocument doc;
          // Дергал этот html документ из ресурсов
          QFile file(":/example.html");
          
          // Если не удалось открыть файл, то возвращаемся из метода
          if (!file.open(QIODevice::ReadOnly) || !doc.setContent(&file))
              return;
          
          // Получаем список всех тегов title
          QDomNodeList titlesList = doc.elementsByTagName("title");
          // Поскольку title обычно один, то берём его Ноду из списка по нулевому индексу
          QDomNode titleNode = titlesList.item(0);
          // Преобразуем Ноду в элемент
          QDomElement element = titleNode.toElement();
          // Тогда получится забрать текст из тега
          qDebug() << element.text();
            KL
            • May 13, 2017, 6:50 p.m.

            А этот модуль работает с удаленными файлами?

            <?xml version="1.0" encoding="utf-8"?>
            <yandexsearch version="1.0">
              <request>
                <query>
                  Платные комментарии
                </query>
                <page>
                  0
                </page>
                <sortby order="descending" priority="no">
                  rlv
                </sortby>
                <maxpassages>
                </maxpassages>
                <groupings>
                  <groupby attr="" mode="flat" groups-on-page="10" docs-in-group="1" curcateg="-1" />
                </groupings>
              </request>
              <response date="20170513T124911">
                <reqid>
                  1494679751371064-722144758077498024982079-sas1-1417-XML
                </reqid>
                <found priority="phrase">
                  31179652
                </found>
                <found priority="strict">
                  31179652
                </found>
                <found priority="all">
                  31179652
                </found>
                <found-human>
                  Нашёлся 31 млн ответов
                  </found-human>
                <results>
                  <grouping attr="" mode="flat" groups-on-page="10" docs-in-group="1" curcateg="-1">
                    <found priority="phrase">
                      140673
                    </found>
                    <found priority="strict">
                      140673
                    </found>
                    <found priority="all">
                      140673
                    </found>
                    <found-docs priority="phrase">
                      229751
                      </found-docs>
                    <found-docs priority="strict">
                      229751
                      </found-docs>
                    <found-docs priority="all">
                      229751
                      </found-docs>
                    <found-docs-human>
                      нашёл 230 тыс. ответов
                      </found-docs-human>
                    <page first="1" last="10">
                      0
                    </page>
                    <group>
                      <doccount>
                        1
                      </doccount>
                      <relevance />
                      <doc id="Z1CDC9256CCB9C8B0">
                        <relevance />
                        <url>
                          http://inetsovety.ru/zarabotok-na-kommentariyah-gde-zarabotaty-denygi/
                        </url>
                        <domain>
                          inetsovety.ru
                        </domain>
                        <title>
                          Заработок на 
                          <hlword>
                            комментариях
                          </hlword>
                          . Где платят деньги за 
                          <hlword>
                            комментарии
                          </hlword>
                          ?
                        </title>
              KL
              • May 13, 2017, 6:51 p.m.

              Вот такое мне выдает Яндекс, я могу его обработать с помощью данного класса?

                KL
                • May 13, 2017, 6:54 p.m.

                При помощи QNetworkAccessManager я могу получить html текст, а яндекс отдает xml файл, думаю ошибка кроется здесь.

                  Evgenii Legotckoi
                  • May 13, 2017, 7:03 p.m.

                  Без разницы. QNetworkAccessManager может забрать как html , так и xml текст. А QDomDocument и остальные сопутствующие классы входят в состав модуля xml , что само по себе говорит о том, что он заточен под работу с xml, да и html код - это тот же самый xml, только у него есть определённый стандарт.

                  Так что ошибка скорее всего в том, что не совсем правильно забираете данные из ответа QNetworkAccessManager`а

                    KL
                    • May 13, 2017, 7:21 p.m.

                    ERROR "Unable to init SSL Context: " Вот что выдает приложение, но с Google все отлично работает.

                      KL
                      • May 13, 2017, 7:50 p.m.

                      Подскажите как быть с тегами a или картинками?

                        KL
                        • May 13, 2017, 8 p.m.

                        Как вывести дерево доступных элементов, которые хранятся в doc?

                          Evgenii Legotckoi
                          • May 13, 2017, 10:40 p.m.

                          Нужно иметь установленные библиотеки OpenSSL и в pro файле должен быть включен модуль network:

                          QT += network

                          Большего в данном случае посоветовать не могу

                            Evgenii Legotckoi
                            • May 13, 2017, 10:46 p.m.

                            Примерно так нужно поступать с тегами a или картинками:

                            QDomNodeList aList = doc.elementsByTagName("a");
                            for (int i = 0; i < aList.count(); ++i)
                            {
                                QDomElement aElement = aList.item(i).toElement();
                                qDebug() << aElement.attribute("href");
                            }

                            То есть дёргать нужный атрибут из найденного тега

                              Evgenii Legotckoi
                              • May 13, 2017, 10:51 p.m.

                              А вот здесь нужно делать модель данных, которую можно будет отобразить в QTreeView . Вообще есть готовый пример Simple DOM Model Example . Поищите его в примерах в Qt Creator. Можно будет оттуда выдернуть классы DomModel и DomItem, которые используются для отображения документа в древовидном виде.

                                KL
                                • May 14, 2017, 12:25 a.m.

                                Подсказка с OpenSSL очень помогла, у меня все вышло!!! Спасибо за видео, тоже очень помогло!!! Я рад) 2 недели не мог добраться до ответа)

                                  Comments

                                  Only authorized users can post comments.
                                  Please, Log in or Sign up
                                  Ua

                                  Qt - Test 001. Signals and slots

                                  • Result:84points,
                                  • Rating points4
                                  Ua

                                  Qt - Test 001. Signals and slots

                                  • Result:42points,
                                  • Rating points-8
                                  ОК

                                  Qt - Test 001. Signals and slots

                                  • Result:47points,
                                  • Rating points-6
                                  Last comments
                                  ИМ
                                  Игорь МаксимовNov. 22, 2024, 9:51 p.m.
                                  Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
                                  Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                  A
                                  ALO1ZEOct. 19, 2024, 5:19 p.m.
                                  Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                  ИМ
                                  Игорь МаксимовOct. 5, 2024, 4:51 p.m.
                                  Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                  d
                                  dblas5July 5, 2024, 8:02 p.m.
                                  QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  Now discuss on the forum
                                  f
                                  firstlunoxodFeb. 15, 2025, 1:46 p.m.
                                  Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                                  Дмитрий
                                  ДмитрийFeb. 3, 2025, 4:24 p.m.
                                  Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                                  NW
                                  Nayo WaiJan. 30, 2025, 7:22 p.m.
                                  не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                                  n
                                  nklyJan. 3, 2025, 12:52 p.m.
                                  Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                                  M
                                  MarselAug. 17, 2023, 12:26 a.m.
                                  OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                                  Follow us in social networks