Вы можете создать два обработчика для файла и стандартного вывода, а затем создать один регистратор с аргументом handlers
для basicConfig
. Это может быть полезно, если у вас одинаковый log_level и формат вывода для обоих обработчиков:
import logging
import sys
file_handler = logging.FileHandler(filename='tmp.log')
stdout_handler = logging.StreamHandler(sys.stdout)
handlers = [file_handler, stdout_handler]
logging.basicConfig(
level=logging.DEBUG,
format='[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s',
handlers=handlers
)
logger = logging.getLogger('LOGGER_NAME')
Вместо того, чтобы взламывать jQuery для этого, я предлагаю вам на минуту выйти из jQuery и использовать необработанные методы XML dom. Используя методы XML Dom, вы можете сделать следующее:
window.onload = function(){
$.ajax({
type: 'GET',
url: 'text.html',
dataType: 'html',
success: function(data) {
//cross platform xml object creation from w3schools
try //Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(data);
}
catch(e)
{
try // Firefox, Mozilla, Opera, etc.
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(data,"text/xml");
}
catch(e)
{
alert(e.message);
return;
}
}
alert(xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue);
}
});
}
Никаких проблем с iframe и т. Д.
Как насчет быстрого переименования тегов?
$.ajax({
type : "GET",
url : 'results.html',
dataType : "html",
success: function(data) {
data = data.replace(/html/g, "xhtmlx");
data = data.replace(/head/g, "xheadx");
data = data.replace(/title/g, "xtitlex");
data = data.replace(/body/g, "xbodyx");
alert($(data).find("xtitlex").text());
}
});
Просто идея - проверенная в FF / Safari - кажется, работает, если вы создаете iframe для временного хранения документа. Конечно, если вы это делаете, может быть разумнее просто использовать свойство src iframe для загрузки документа и делать все, что вы хотите, в его "onload".
$(function() {
$.ajax({
type: 'GET',
url: 'result.html',
dataType: 'html',
success: function(data) {
var $frame = $("<iframe src='about:blank'/>").hide();
$frame.appendTo('body');
var doc = $frame.get(0).contentWindow.document;
doc.write(data);
var $title = $("title", doc);
alert('Title: '+$title.text() );
$frame.remove();
}
});
});
Мне пришлось добавить iframe в тело чтобы получить .contentWindow.
Это работает. Я просто разделил строительные блоки для лучшей читаемости.
Проверьте объяснение и встроенные комментарии, чтобы понять, как это работает и почему это должно быть сделано таким образом.
Конечно, это нельзя использовать для извлечения cross-domain-content для этого вам нужно либо проксировать вызовы через свой скрипт, либо подумать об интеграции чего-нибудь вроде flXHR (Cross-Domain Ajax with Flash)
call.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>asd</title>
<script src="jquery.js" type="text/javascript"></script>
<script src="xmlDoc.js" type="text/javascript"></script>
<script src="output.js" type="text/javascript"></script>
<script src="ready.js" type="text/javascript"></script>
</head>
<body>
<div>
<input type="button" id="getit" value="GetIt" />
</div>
</body>
</html>
jquery.js (jQuery 1.3.2 без сжатия) test.html действительный XHTML-документ
xmlDoc.js
// helper function to create XMLDocument out of a string
jQuery.createXMLDocument = function( s ) {
var xmlDoc;
// is it a IE?
if ( window.ActiveXObject ) {
xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
xmlDoc.async = "false";
// prevent erros as IE tries to resolve the URL in the DOCTYPE
xmlDoc.resolveExternals = false;
xmlDoc.validateOnParse = false;
xmlDoc.loadXML(s);
} else {
// non IE. give me DOMParser
// theoretically this else branch should never be called
// but just in case.
xmlDoc = ( new DOMParser() ).parseFromString( s, "text/xml" );
}
return xmlDoc;
};
output.js
// Output the title of the loaded page
// And get the script-tags and output either the
// src attribute or code
function headerData(data) {
// give me the head element
var x = jQuery("head", data).eq(0);
// output title
alert(jQuery("title", x).eq(0).text());
// for all scripttags which include a file out put src
jQuery("script[src]", x).each(function(index) {
alert((index+1)+" "+jQuery.attr(this, 'src'));
});
// for all scripttags which are inline javascript output code
jQuery("script:not([src])", x).each(function(index) {
alert(this.text);
});
}
ready.js
$(document).ready(function() {
$('#getit').click(function() {
$.ajax({
type : "GET",
url : 'test.html',
dataType : "xml",
// overwrite content-type returned by server to ensure
// the response getst treated as xml
beforeSend: function(xhr) {
// IE doesn't support this so check before using
if (xhr.overrideMimeType) {
xhr.overrideMimeType('text/xml');
}
},
success: function(data) {
headerData(data);
},
error : function(xhr, textStatus, errorThrown) {
// if loading the response as xml failed try it manually
// in theory this should only happen for IE
// maybe some
if (textStatus == 'parsererror') {
var xmlDoc = jQuery.createXMLDocument(xhr.responseText);
headerData(xmlDoc);
} else {
alert("Failed: " + textStatus + " " + errorThrown);
}
}
});
});
});
В Opera все работает без createXMLDocument
и функция beforeSend
.
Дополнительные уловки необходимы для Firefox (3.0.11) и IE6 (не могут протестировать IE7, IE8 и другие браузеры), поскольку у них возникает проблема, когда Content-Type:
, возвращаемый сервером, не означает, что это xml. Мой веб-сервер вернул Content-Type: text / html; charset = UTF-8
для test.html.
В этих двух браузерах jQuery вызвал обратный вызов error
с textStatus
, сообщив parsererror
. Поскольку в строке 3706 в jQuery.js
data = xml ? xhr.responseXML : xhr.responseText;
data
устанавливается равным нулю. Как и в FF и IE, xhr.responseXML
имеет значение NULL. Это происходит потому, что они не понимают, что возвращенные данные - это xml (как это делает Opera). И только xhr.responseText
задается с полным xhtml-кодом. Поскольку данные равны нулю, строка 3708
if ( xml && data.documentElement.tagName == "parsererror" )
генерирует исключение, которое перехватывается в строке 3584, а статус устанавливается на parsererror
.
В FF я могу решить проблему, используя overrideMimeType ( )
перед отправкой запроса.
Но IE не поддерживает эту функцию в объекте XMLHttpRequest, поэтому я должен сам сгенерировать XMLDocument, если выполняется обратный вызов ошибки и возникает ошибка parsererror
.
пример для test.html
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Plugins | jQuery Plugins</title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">var imagePath = '/content/img/so/';</script>
</head>
<body>
</body>
</html>
Бесстыдно скопирован и адаптирован из другого моего ответа ( Простой пример jQuery ajax, не находящий элементы в возвращенном HTML ), это извлекает HTML удаленной страницы, затем parseHTML Функция создает для него временный элемент div и помещает лот внутрь, проходит через него и возвращает запрошенный элемент. Затем jQuery предупреждает текст () внутри.
$(document).ready(function(){
$('input').click(function(){
$.ajax({
type : "POST",
url : 'ajaxtestload.html',
dataType : "html",
success: function(data) {
alert( data ); // shows whole dom
var gotcha = parseHTML(data, 'TITLE'); // nodeName property returns uppercase
if (gotcha) {
alert($(gotcha).html()); // returns null
}else{
alert('Tag not found.');
}
},
error : function() {
alert("Sorry, The requested property could not be found.");
}
});
});
});
function parseHTML(html, tagName) {
var root = document.createElement("div");
root.innerHTML = html;
// Get all child nodes of root div
var allChilds = root.childNodes;
for (var i = 0; i < allChilds.length; i++) {
if (allChilds[i].nodeName == tagName) {
return allChilds[i];
}
}
return false;
}
Чтобы вывести несколько элементов или список тегов сценария, скажем, я думаю, вам нужно улучшить функцию parseHTML, но эй - доказательство концепции: -)
Если вы хотите найти значение специально названных полей ( т.е. входные данные в форме) что-то вроде этого найдет их для вас:
var fields = ["firstname","surname", ...."foo"];
function findFields(form, fields) {
var form = $(form);
fields.forEach(function(field) {
var val = form.find("[name="+field+"]").val();
....
После синтаксического анализа строки XML в XML DOM
, Я бы либо использовал jQuery
на нем напрямую (вы можете сделать это, указав контекст для селектора jQUery
), например $ (': title', xdoc. rootElement)
или с помощью XPath
(работает в Firefox; якобы существуют библиотеки для IE, но я не добился хороших результатов).