Использование модуля python 'lxml' в Apache Nifi [duplicate]

Почему ваш код не работает

Как объяснялось во введении HTML-учебника , HTMLWorker устарели много лет назад. Он не предназначен для преобразования полных HTML-страниц. Он не знает, что на странице HTML есть раздел и ; он просто разбирает весь контент. Он предназначен для анализа небольших фрагментов HTML, и вы можете определять стили с помощью класса StyleSheet; Настоящий CSS не поддерживался.

Затем появился XML Worker. XML Worker предназначался как универсальная среда для анализа XML. В качестве доказательства концепции мы решили написать некоторые функциональные возможности XHTML для PDF, но мы не поддерживали все теги HTML. Например: формы вообще не поддерживались, и было очень сложно поддерживать CSS, который используется для размещения контента. Формы в HTML очень сильно отличаются от форм в PDF. Также существует несоответствие между архитектурой iText и архитектурой HTML + CSS. Постепенно мы расширили XML Worker, в основном на основе запросов от клиентов, но XML Worker стал монстром со многими щупальцами.

В конце концов, мы решили переписать iText с нуля, с требованиями для преобразования HTML + CSS в разум. Это привело к iText 7 . В дополнение к iText 7 мы создали несколько надстроек, наиболее важным из которых является pdfHTML .

Как решить проблему

Использование в последней версии iText (iText 7.1.0 + pdfHTML 2.0.0) код для преобразования HTML из вопроса в PDF сводится к этому фрагменту:

public static final String SRC = "src/main/resources/html/sample.html";
public static final String DEST = "target/results/sample.pdf";
public void createPdf(String src, String dest) throws IOException {
    HtmlConverter.convertToPdf(new File(src), new File(dest));
}

Результат выглядит следующим образом:

Как вы можете видеть, это в значительной степени результат, которого вы ожидаете. Так как iText 7.1.0 / pdfHTML 2.0.0, шрифтом по умолчанию является Times-Roman. CSS уважается: изображение теперь плавает справа.

Некоторые дополнительные мысли.

Разработчики часто не возражают против перехода на новую версию iText, когда я даю совет обновить до iText 7 / pdfHTML 2. Разрешить мне ответить на три основных аргумента, которые я слышу:

Мне нужно использовать бесплатный iText, а iText 7 не является бесплатным / файл pdfHTML add -on является закрытым источником.

iText 7 выпущен с использованием AGPL, так же как iText 5 и XML Worker. AGPL позволяет бесплатное использование в смысле бесплатно в контексте проектов с открытым исходным кодом. Если вы распространяете закрытый исходный / проприетарный продукт (например, используете iText в контексте SaaS), вы не можете использовать iText бесплатно; в этом случае вам необходимо приобрести коммерческую лицензию. Это уже было верно для iText 5; это все еще верно для iText 7. Что касается версий до iText 5: , вы не должны использовать их вообще . Что касается pdfHTML: первые версии действительно были доступны только в виде программного обеспечения с закрытым исходным кодом. У нас была тяжелая дискуссия в iText Group: с одной стороны, были люди, которые хотели избежать массового злоупотребления со стороны компаний, которые не слушают своих разработчиков, когда те разработчики сообщают, что это открытый источник не является так же как и бесплатно. Разработчики рассказывали нам, что их босс заставил их поступать не так, и что они не смогли убедить своего босса приобрести коммерческую лицензию. С другой стороны, были люди, которые утверждали, что мы не должны наказывать разработчиков за неправильное поведение их боссов. В конце концов, люди в пользу open sourcing pdfHTML, то есть разработчики iText, выиграли этот аргумент. Убедитесь, что они не ошибаются и правильно используют iText: соблюдайте AGPL, если вы используете iText бесплатно ; убедитесь, что ваш босс покупает коммерческую лицензию, если вы используете iText в контексте с закрытым исходным кодом.

Мне нужно поддерживать устаревшую систему, и мне нужно использовать старую версию iText.

Серьезно? Техническое обслуживание также предполагает применение обновлений и переход на новые версии программного обеспечения, которое вы используете. Как вы можете видеть, код, необходимый при использовании iText 7 и pdfHTML, очень прост и менее подвержен ошибкам, чем тот, который нужен ранее. Проект миграции не должен занять слишком много времени.

Я только что начал, и я не знал о iText 7; Я узнал только после того, как закончил свой проект.

Вот почему я отправляю этот вопрос и отвечаю. Подумайте о себе как о программисте eXtreme. Отбросьте весь свой код и начните заново. Вы заметите, что это не так много работы, как вы себе представляли, и вы будете лучше спать, зная, что вы сделали ваш проект надежным, потому что iText 5 постепенно прекращается. Мы по-прежнему предлагаем поддержку для оплаты клиентов, но в конечном итоге мы прекратим поддерживать iText 5 вообще.

45
задан Ripon Al Wasim 5 April 2013 в 07:19
поделиться

4 ответа

Некоторые модули Python, такие как lxml, имеют требуемые компоненты в C. Они не будут работать в Jython.

Большинство пакетов Python будут работать нормально, и вы можете установить их, используя те же инструменты, что и вы используете в CPython. Это , описанное в Приложении A книги Jython :

Чтобы получить setuptools, загрузите ez_setup.py из http://peak.telecommunity.com/dist /ez_setup.py. Затем перейдите в каталог, в который вы покинули загруженный файл, и выполните:

$ jython ez_setup.py

[Сценарий easy_install] будет установлен в каталог bin установки Jython (/home/lsoto/jython2.5.0/bin в приведенном выше примере) , Если вы часто работаете с Jython, рекомендуется добавить этот каталог к ​​переменной среды PATH, поэтому вам не нужно вводить весь путь каждый раз, когда вы хотите использовать easy_install или другие скрипты, установленные в этом каталоге.

Проверяя это самостоятельно, после установки setuptools в Jython, pip установлен правильно:

$ sudo /usr/bin/jython2.5.2b1/bin/easy_install pip
Searching for pip
[...]
Installing pip-2.5 script to /usr/bin/jython2.5.2b1/bin
Installing pip script to /usr/bin/jython2.5.2b1/bin

Installed /usr/bin/jython2.5.2b1/Lib/site-packages/pip-1.0.2-py2.5.egg
Processing dependencies for pip
Finished processing dependencies for pip

$ sudo /usr/bin/jython2.5.2b1/bin/pip install bottle
Downloading/unpacking bottle
  Downloading bottle-0.9.6.tar.gz (45Kb): 45Kb downloaded
  Running setup.py egg_info for package bottle
    Installing collected packages: bottle
  Running setup.py install for bottle
Successfully installed bottle
Cleaning up...

$ jython
Jython 2.5.2b1 (Release_2_5_2beta1:7075, Jun 28 2010, 07:44:20) 
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_26
Type "help", "copyright", "credits" or "license" for more information.
>>> import bottle
>>> bottle
<module 'bottle' from '/usr/bin/jython2.5.2b1/Lib/site-packages/bottle$py.class'>
>>>
34
ответ дан Jeremy 26 August 2018 в 05:00
поделиться

В соответствии с v2.7b4, дистрибутив Jython включает модуль обеспечения памяти , который упрощает установку пунктов pip и setuptools:

jython -m ensurepip

Остерегайтесь sys.platform == 'win32' issue , который поможет вам использовать пакеты PyPI, которые полагаются на этот метод для определения платформы хоста.

9
ответ дан Community 26 August 2018 в 05:00
поделиться

Являюсь Jython, хотя у вас есть возможности библиотек Java, а не ограничение того, что вы не можете установить несколько библиотек C. python.

Например, вам лучше использовать Jsoup вместо Beautiful soup или пойти на полное решение, например Jtidy .

Используйте Jaxp вместо lxml.

Также другой вариант, который подходит для ваших повторений: NekoHTML

7
ответ дан Jean-Francois T. 26 August 2018 в 05:00
поделиться

У меня установлены как CPython, так и Jython. Вот что я делаю, если я хочу установить пакет в Jython через pip.

jython -m pip install <package_name>

Например, для установки рамки робота в jython (поскольку я хочу писать библиотеки ключевых слов в Java), я сделал

jython -m pip install robotframework
0
ответ дан Moses 26 August 2018 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: