LINUX.ORG.RU

4
Всего сообщений: 30

import в python для работы с html

имеется несколько html файлов по которым нужно пройти, найти все <a href=«#...»> элементы и заменить на <a href=«file.html#...»>. посоветуйте какой модуль следует использовать.

 , , , ,

scripthacker ()

Как на javascript сделать горячие клавиши на сайте?

Добрый день товарищи программисты! Дайте пожалуйста совет, как вообще реализовывают горячие клавиши на сайте? Я конечно пробовал много вариантов, но так и не нашел подходящего момента. Как вообще правильно эту функцию реализовывают? В справочнике MDN я нашел некий интерфейс, но все равно результаты не увенчались.

Я хочу такую горячую клавишу, когда посетитель заходит на сайт и он смог горячей клавишей «пробела» затемнить цветовую схему сайта. Удобно все же согласитесь?

Набросал немного говнокода, но когда нажимаю «пробел» код не работает. Браузер Chrome.

'use strict';

document.addEventListener('keydown', (event) => {
  const keyName = event.key;

  if (keyName === 'Space')
    alert('это alert только для теста')
    return;
});

 , , ,

dimcoin ()

Парсинг невалидного (не по стандартам) DOM

Использую простую схему:


        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = null;
        try {
            db = dbf.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            throw new HtmlProcessorException(e);
        }
        Document xml = null;
        try {
            xml = db.parse(new ByteArrayInputStream(html.getBytes(StandardCharsets.UTF_8)));
        } catch (SAXException e) {
            throw new HtmlToXmlConvertionException("Html parsing exception", e);
        } catch (IOException e) {
            throw new HtmlToXmlConvertionException("Html reading exception", e);
        }

Но HTML содержит ноду с неопределенным атрибутом:

<link href="https://..." mask rel="icon" sizes="any">

В этом примере - mask не определен, выбрасывается эксепшн:

Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1442; Attribute name "mask" associated with an element type "link" must be followed by the ' = ' character.

Не могу нагуглить, есть ли способы заставить парсер воспринимать такие ситуации правильно, т.е. считать, что если нет ="", то атрибут с пустым значением? Или все-таки придется еще регекспами искать такое и вставлять это «дефолтное» значение?

 , , , ,

bvn13 ()

Как получить атрибут элемента из DOM в явном виде, без преобразования спецсимволов?

Есть у меня XML-документы, в которых могут встречаться такие вещи:

<item id="14925" name="&lt;table&gt; - создание таблиц"/>

Когда идет разбор данного XML через DOM, значение атрибута name получается с помощью вот такого кода:
$name=$currElement->getAttribute("name");

Проблема в том, что метод getAttribute() автоматически преобразует строку атрибута так, что спецсимволы в строке атрибута будут преобразованы в настоящие символы. И поэтому в переменной $name будет значение:
"<table> - создание таблиц"

А мне необходимо, чтобы значение атрибута было взято как есть, без преобразования.

Вот тут похожая проблема, но ответа никто не знает: https://ru.stackoverflow.com/questions/822685/domelementsetattribute-добавить...

Вопрос: как получить значение атрибута из DOM в явном виде?

 , , , ,

Xintrea ()

Как при помощи QDomDocument вставить XML в качестве значения поля?

Привет, лор.

Мне нужно вставить XML-документ в одно из полей другого XML-документа. Это не моя прихоть, так требует ТЗ:)

Делаю это так:

	// создаю внешний документ
	QDomDocument doc;
	doc.appendChild(doc.createProcessingInstruction("xml", "version=\"1.0\"" ));
	auto item = doc.createElement("item");
	doc.appendChild(item);

	// создаю вложенный документ
	QDomDocument innerDoc;
	innerDoc.appendChild(innerDoc.createElement("foo"));
	innerDoc.appendChild(innerDoc.createElement("bar"));

	// вставляю вложенный документ
	QDomText nameText = doc.createTextNode("xml");
	item.appendChild(nameText);

Всё получается, вложенный xml эскейпится, но есть проблема. Не эскейпится символ «>». Получается, что xml выглядит вот так:

<?xml version="1.0"?>
<item>
   <xml>&lt;foo/>
&lt;bar/>
</xml>
</item>

Я даже нашёл баг, посвящённый этой проблеме: https://bugreports.qt.io/browse/QTBUG-16020. Баг старый, закрыт как invalid. Там написано, что такое поведение правильное, и соответствует стандарту XML.

К сожалению, тот софт, который принимает сформированные мной документы, не согласен с этим, и не понимает мои документы. Поэтому нужно как-то это побороть. Если заэскейпить строку вручную, до передачи её в createTextNode(), она эскейпится снова, и получается совсем плохо.

Мне бы помогла какая-нибудь функция в QDom, которая позволяет вставить произвольный текст.

Или может быть можно как-то взять qdom.cpp и qdom.h, скопировать к себе в проект и поправить под себя?

В общем, жду идей.

 , ,

Beewek ()

Можно ли в Cefpython (порт браузерного движка хромиум для Python), нормально работать с DOM?

Решил потыкать палочкой в CEF (хромиум ембадед фреймворк), а точнее в его порт на язык Python с помощью либы

https://github.com/cztomczak/cefpython

И появились несколько вопросов. Так как, я пока понимаю буржуйский язык плохо + большинство материалов в сети сосредочены на C++ CEF, далее идет материал для CefSharp (порт для c#), а питоновской реализации уделено мало внимания в сее обществе + не шибко хорошая документация с малыми примерами.

Суть вопроса в чём, можно ли нормально работать с DOM , например как это делает selenium или как лучше будет реализовать это. Что бы было не шибко геморройно в коде прописать алгоритм управления курсором мыши и он по каком-нибудь селектору жмякнул.

Вналичие будет только Qt4-PySide для отрисовки гуя браузера и собственно CefPython. Вроде в том же qtwebkit4 это достаточно просто делалось, но как бы не прискорбно это писать, нынче это вебкит уже совсем устарел и с современными веб сайтами уже не фуручит.

На стековерфлоу читал, что как-то в С# с помошью каких-то костылей , делали такое у себя.

И еще, почему библиотеки CEF в Линукс весит в 2 раза больше, чем в том же Виндовс?

Какие ваши мнения по данному поводу, господа офицеры по натянутым нервам?

 , , ,

NetSurf ()

QDomDocument внесение изменений в XML Документ.

Есть XML примерно такого содержания:

<mod type="1">
   <el type="p" at="5" bt="6" />
   <el type="D" at="5" bt="6" />
</mod>
<mod type="2">
   <el type="p" at="4" bt="3" />
   <el type="D" at="4" bt="6" />
</mod>
Считываю его в QDomDocument. __Нужно поменять значения атрибутов at и bt у элементов с типом D и записать обратно в файл._

Что то по документации Qt не могу понять, как это сделать не создавая новый QDomDocument и пихая туда по очереди все элементы старого с нужными изменениями,

Подскажите как это сделать?

 , ,

golodranez ()

Специалистам WEB: Ищу глобальное событие document

Есть ajax запрос, по результатам которого выполняется

//...
success: function(data) {
   $('#ajax-content').html(data);
},
//...

Вопрос: на это изменение DOM какое-нибудь событие генерится?

 , ,

bvn13 ()

Бесконечная прокрутка с unload

Привет, ребята.

Я пытаюсь реализовать идеальную бесконечную прокрутку, идеальность заключается в удалении узлов ушедших за горизонт, в том числе и для мобильных девайсов. Тут есть разные подходы и разные глюки в итоге.

Варианты которые я пробовал.

1. Использование пустого div сверху в качестве держателя скролла. Когда мы удаляем ушедший за вьюпорт элемент, то мы берем его высоту и прибавляем к высоте пустого div. Тут хотя бы нет моргания при манипуляциях с дом. Но проблема кроется в том, что юзер может загнать вьюпорт на этот пустой div при обратном скролле. Эта проблема особенно актуальна в дефолтном андроидном браузере, там пока анимация скролла не остановится хрен получишь какие эвенты, подход с таймером не спасает от этого случая. То, что юзер загнал вьюпорт на этот пустой div наверное можно как-то решить, если принять какой-то вариант правильным в этом случае.

2. Есть второй подход - запоминать позицию прокрутки и возвращать на неё. Все бы хорошо. юзер особо не поскачет. ибо полоса скролла всегда под контролем, но тут в андроидном браузере и в фоксе проявляются скачки контента на странице при обновлении dom.

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

Ну и вопрос в том как добиться того чего я хочу? Или может быть я трачу силы зря и современные банано-технологии этого не позволяют и я должен ограничиться тупенькой кнопкой «Load More».

Что касается бесконечной прокрутки, то она в моём случае уместна, я знаю, что её порой не любят.

 , ,

PoMbl4 ()

Выдрать срендеренный HTML

В продолжение моей прошлой темы про JS логирование на клиенте
И всё было бы хорошо, но возникла необходимость использовать QUnit.
То есть финальная страница генерируется JS, результаты пишутся в <div id='qunit'>
На компе всё прекрасно работает посредством xmlhttp.send(document.getElementById(«qunit»).innerHTML), но с коробки почему-то пустой результат.
Пробовал варианты document.getElementsByTagName('html')[0].innerHTML, пробовал вообще все элементы проверить посредством document.getElementsByTagName(«*») - но срендеренного HTML нет, виден только изначальный.
Поначалу списал на задержки при генерации, но выставленные задержки тоже не помогли.
Есть ли ещё какие-то варианты получить финальное содержимое div'а или перенастроить QUnit писать в какую-то переменную?

 , , ,

zolden ()

Как бы получить QDomNode для элемента с текстом из пробелов?

Продолжаю решать задачку очистки форматирования в QTextEdit. Я решил проблему «съедания» пробелов при вызове QTextEdit::insertHtml() путем замены их в HTML на спецсимвол UFFFD (Replacement Character) перед передачей в insertHtml(), и последующей замены уже в QTextDocument методами курсора.

Но тут вылезла другая проблема.

Если взять HTML-код методом:

textArea->textCursor().selection().toHtml()


засунуть его в QDomDocument, получить из DOM код XML и вставить его на прежнее место через QTextEdit::insertHtml(), то текст изменится. При каких условиях? А вот при каких.

Если на экране мы видим четыре пробела и текст, исходный HTML будет следующий:

<p>
  <span>    text</span>
</p>


При парсинге в QDomDocument, текстовый узел будет содержать текст

"    text"


Если на экране мы видим четыре пробела и ссылку, HTML будет следующий:

<p>
  <span>    </span>
  <a href="http://yandex.ru">
    <span>text</span>
  </a>
</p>


При парсинге в QDomDocument, текстовой ноды из четырех пробелов внутри элемента span не будет! И таким образом, когда мы конвертнем обратно DOM в XML, эти четыре пробела пропадут. А нужно, чтоб они сохранились.

Вопрос. Как обойти такую проблему?

 , , , ,

Xintrea ()

Что-то я запутался со свойством children и методом children() в DOM

Народ, пару лет назад написал скрипт, в котором использовалась такая конструкция:

var recordCount=currentElement.children("recordtable").children("record").length;

она работала во всех браузерах, от Firefox и Konqueror до IE8.

Я уже забыл что такое яваскрипт. А сейчас смотрю - скрипт не работает. Стал дебажиться, а проблема вот в этой строчке. Сколько бы не было элементов record, всегда получаем 1.

Полез на W3C, смотрю: в DOM-модели есть только children как свойство, а children() как метода нет:

http://www.w3schools.com/jsref/dom_obj_all.asp

Я то ли отстал от жизни, то ли уже новые движки по-другому работают. Я уже и не помню, почему использовал имя элемента в качестве параметра children(), и оно работало. Факт в том, что теперь не работает.

Вопроc: как по-быстрому исправить?

 , ,

Xintrea ()

Затупил. DOM в Qt. Не могу рекурсивно перебрать QDomElement

У меня в памяти есть QDomDocument. Его нужно сохранить на диск. Перед сохранением надо атрибуты некоторых элементов изменить (расшифровать). Элементы вложены, необходима рекурсия. DOM-элементы должны меняться (менять свои атрибуты) внутри рекурсии.

Примерный код такой:

void KnowTreeModel::saveDecryptDoc(QDomDocument &doc)
{
  decrypt(doc);

  // Запись DOM данных в файл
  QFile wfile("file.xml");
  QTextStream out(&wfile);
  out.setCodec("UTF-8");
  out << doc.toString();
}


void KnowTreeModel::decrypt(QDomDocument &doc)
{
  QDomElement contentElement=doc.documentElement().firstChildElement("content").firstChildElement("node");

  decryptRecurse(contentElement);

  return;
}


void KnowTreeModel::decryptRecurse(QDomElement &element)
{
  // Расшифровка атрибутов
  element.setAttribute("cryptData", decryptMyData(element.attribute("cryptData") ));

  // Рекурсивный вызов дочерних элементов
  QDomNodeList childList=element.childNodes();
  for(int i=0; i<childList.count(); i++) // для QDomNodeList цикл foreach не работает
    if(childList.at(i).isElement())
      decryptRecurse(childList.at(i).toElement()); // <!-- Что тут надо написать ???
}


Проблема в том, что рекурсивная функция должна работать через QDomElement (долго объяснять почему, проект большой). А я не могу понять, как у QDomElement получить дочерние QDomElement.

У QDomElement есть только возможность получить QDomNodeList, но тип у полученных элементов - QDomNode.

А у этого QDomNode невозможно получить указатель на QDomElement, можно только получить новый QDomElement через метод toElement().

(Блин, вообще-то мне нужна ссылка на QDomElement, но я уже сломал мосг).

В общем, вопрос в следующем: как у QDomElement перебрать дочерние QDomElement и что-нибудь в них изменить?

 , , ,

Xintrea ()

Как сделать глубокую копию QDomNode в конструкторе копирования?

Есть некий класс Record, в котором есть protected-свойство:

QDomElement setupDomElement;


В момент копирования надо создать глубокую копию этого свойства.

Я пишу так:

Record::Record(const Record &obj)
{
  ...
  setupDomElement=obj.setupDomElement.cloneNode();
  ...
}


И при компиляции получаю ошибку:

../mytetra/src/models/recordTable/Record.cpp: In copy constructor 'Record::Record(const Record&)':
../mytetra/src/models/recordTable/Record.cpp:42:18: error: no match for 'operator=' (operand types are 'QDomElement' and 'QDomNode')
   setupDomElement=obj.setupDomElement.cloneNode();
                  ^
../mytetra/src/models/recordTable/Record.cpp:42:18: note: candidate is:
In file included from /media/wd_640_part_2/opt/Qt_5_4_2/5.4/gcc/include/QtXml/QDomElement:1:0,
                 from ../mytetra/src/models/recordTable/Record.cpp:3:
/media/wd_640_part_2/opt/Qt_5_4_2/5.4/gcc/include/QtXml/qdom.h:470:18: note: QDomElement& QDomElement::operator=(const QDomElement&)
     QDomElement& operator= (const QDomElement&);
                  ^
/media/wd_640_part_2/opt/Qt_5_4_2/5.4/gcc/include/QtXml/qdom.h:470:18: note:   no known conversion for argument 1 from 'QDomNode' to 'const QDomElement&'
Makefile:23058: recipe for target 'build/Record.o' failed
make: *** [build/Record.o] Error 1
22:03:31: Процесс «/usr/bin/make» завершился с кодом 2.


Насколько я понял, метод cloneNode() возвращающий QDomNode, не может примениться к obj.setupDomElement, так как obj имеет тип const QDomElement&.

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

Вопрос. Как обойти сию проблему, и сделать глубокую копию QDomElement в конструкторе копирования?

 , ,

Xintrea ()

вопрос по oncopy

document.oncopy отрабатывает дважды(тестил в хроме), по ctrl-c, а если копировать мышью, то норм. Чезана?

UPD Видимо, дело в моем буке, как-то он по-своему нажатия клавиш обрабатывает. Попробовал на другом компе, все нормально.

 , ,

goodbigbeer ()

Мужики, объясните по React.js!

Всем доброго времени суток!

В последнее время я все чаще стал натыкаться на статьи, посвященные библиотеке React.js, которая реализует слой view для веб-приложений. говорят, что этот самый реакт быстр как сатана (в хорошем смысле) :). Но я, будучи незнакомым с внутренним устройством реакта, засомневался, как может какая-то высокоуровневая обертака над DOM (а точнее над виртуальным дом'ом) работать быстрее, чем, скажем, шаблонизатор в underscore, который «ворочает» непосредственно _реальный_ DOM?

Вопрос, какой код будет рабоать быстрее (объективно), который манипулирует реальным домом или аналогичный код, который сначала манипулирует виртуальным, а затем уже встраивается в реальный DOM?

Заранее спасибо.

 , ,

KernelPanic ()

Shadow DOM: Скрытая угроза

Наступающий Shadow DOM позволяет создать HTML-блоки, которые будут видны на странице, но содержимое которых будет «черным ящиком», отсутствующим в дереве DOM, и у которых будут свои стили, на которые не смогут повлиять стили, заданные извне. Внимание, вопрос: не затруднит ли это использование пользовательских стилей (Stylish) и скриптов (Greasemonkey)?

 , , ,

greatchina ()

Ограничения DOM/JS

Собственно есть двигло клиентского OLAP'а на JS если просто вертеть куб то все ок. Проблема возникает если дернуть полностью детализированную информацию (даже если размерность равна 2) и заключается в том что все протестированные браузеры намертво виснут на 80% процессинга (всего ~230000 записей). Собственно нет ли тут каких либо захаркоженных лимитов?

 ,

exception13 ()

Ооочень странное поведение Simple Html DOM

Пишу тут для себя одну штуку, типа парсера сайтов. Собственно, с помощью Simple Html DOM распарсил несколько меня интересующих, дошел до последнего и... Вообще не понимаю, как его парсить.

Во первых, я не могу получить страницу функцией file_get_html(). Возвращались какие то две строки со слетевшей кодировкой, гуглеж не помог.

Тяну страницу curl'ом - скачивается, все хорошо. На странице есть такой кусок:

<span class="price">
    <ins class="num">20 670</ins>
    <ins class="rub">руб.</ins>
</span>
Казалось бы, проще не бывает! Далее, запускаю вот это:
foreach ($html->find('span') as $span) {
    if ($span->class == "price") { // Не работает
        ...
    }
}
Это просто бред какой то. Я все сайты распарсил таким образом, а вот этот ни как не получается.

 , ,

Deleted ()

Редактирование всех полей в org.wc3.dom.Document

Имеется документ org.wc3.dom.Document. Нужно просмотреть текстовые ноды и значения аттрибутов и заменить невалидные xml символы(с 00 по 32, исключая 9,10,13). Есть жесткие требования к скорости работы.

Может кто-то сталкивался, как можно эффективно сделать эту проверку и замену? Итерировать по всем элементам или трансформировать документ в строку, обработать ее, а потом распарсить обратно в документ? Или есть еще какие способы?

 , , ,

by_zero ()