Javascript 第三方XML解析器(xpath.js)给出错误;未捕获的结束标记名:div与当前开始标记名“不匹配”;

Javascript 第三方XML解析器(xpath.js)给出错误;未捕获的结束标记名:div与当前开始标记名“不匹配”;,javascript,xml,node.js,xpath,parse-platform,Javascript,Xml,Node.js,Xpath,Parse Platform,使用parse.com的云代码,我试图从网页上抓取数据发送到我的iOS应用程序。我已经在iOS中实现了web抓取代码,但我正在尝试将此任务移动到后端。我正在使用一个名为node.js的库 但是,当我运行代码时,我收到以下错误: "Uncaught end tag name: div is not match the current start tagName:script" 正如我前面提到的,我已经能够使用一个单独的objective-c库成功地刮取web数据,因此标记是一致的,问题不可能存在

使用parse.com的云代码,我试图从网页上抓取数据发送到我的iOS应用程序。我已经在iOS中实现了web抓取代码,但我正在尝试将此任务移动到后端。我正在使用一个名为node.js的库

但是,当我运行代码时,我收到以下错误:

"Uncaught end tag name: div is not match the current start tagName:script"
正如我前面提到的,我已经能够使用一个单独的objective-c库成功地刮取web数据,因此标记是一致的,问题不可能存在于源代码中

对于源代码,这里是。StackOverflow不允许我直接链接到源代码,否则我会提供直接链接

编辑:

下面是dom-parser.js中的代码

function DOMParser(options){
    this.options = options ||{locator:{}};

}
DOMParser.prototype.parseFromString = function(source,mimeType){    
    var options = this.options;
    var sax =  new XMLReader();
    var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
    var errorHandler = options.errorHandler;
    var locator = options.locator;
    var defaultNSMap = options.xmlns||{};
    var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
    if(locator){
        domBuilder.setDocumentLocator(locator)
    }

    sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
    sax.domBuilder = options.domBuilder || domBuilder;
    if(/\/x?html?$/.test(mimeType)){
        entityMap.nbsp = '\xa0';
        entityMap.copy = '\xa9';
        defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
    }
    if(source){
        sax.parse(source,defaultNSMap,entityMap);
    }else{
        sax.errorHandler.error("invalid document source");
    }
    return domBuilder.document;
}
function buildErrorHandler(errorImpl,domBuilder,locator){
    if(!errorImpl){
        if(domBuilder instanceof DOMHandler){
            return domBuilder;
        }
        errorImpl = domBuilder ;
    }
    var errorHandler = {}
    var isCallback = errorImpl instanceof Function;
    locator = locator||{}
    function build(key){
        var fn = errorImpl[key];
        if(!fn){
            if(isCallback){
                fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
            }else{
                var i=arguments.length;
                while(--i){
                    if(fn = errorImpl[arguments[i]]){
                        break;
                    }
                }
            }
        }
        errorHandler[key] = fn && function(msg){
            fn(msg+_locator(locator));
        }||function(){};
    }
    build('warning','warn');
    build('error','warn','warning');
    build('fatalError','warn','warning','error');
    return errorHandler;
}
/**
 * +ContentHandler+ErrorHandler
 * +LexicalHandler+EntityResolver2
 * -DeclHandler-DTDHandler 
 * 
 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
 */
function DOMHandler() {
    this.cdata = false;
}
function position(locator,node){
    node.lineNumber = locator.lineNumber;
    node.columnNumber = locator.columnNumber;
}
/**
 * @see org.xml.sax.ContentHandler#startDocument
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
 */ 
DOMHandler.prototype = {
    startDocument : function() {
        this.document = new DOMImplementation().createDocument(null, null, null);
        if (this.locator) {
            this.document.documentURI = this.locator.systemId;
        }
    },
    startElement:function(namespaceURI, localName, qName, attrs) {
        var doc = this.document;
        var el = doc.createElementNS(namespaceURI, qName||localName);
        var len = attrs.length;
        appendElement(this, el);
        this.currentElement = el;

        this.locator && position(this.locator,el)
        for (var i = 0 ; i < len; i++) {
            var namespaceURI = attrs.getURI(i);
            var value = attrs.getValue(i);
            var qName = attrs.getQName(i);
            var attr = doc.createAttributeNS(namespaceURI, qName);
            if( attr.getOffset){
                position(attr.getOffset(1),attr)
            }
            attr.value = attr.nodeValue = value;
            el.setAttributeNode(attr)
        }
    },
    endElement:function(namespaceURI, localName, qName) {
        var current = this.currentElement
        var tagName = current.tagName;
        this.currentElement = current.parentNode;
    },
    startPrefixMapping:function(prefix, uri) {
    },
    endPrefixMapping:function(prefix) {
    },
    processingInstruction:function(target, data) {
        var ins = this.document.createProcessingInstruction(target, data);
        this.locator && position(this.locator,ins)
        appendElement(this, ins);
    },
    ignorableWhitespace:function(ch, start, length) {
    },
    characters:function(chars, start, length) {
        chars = _toString.apply(this,arguments)
        //console.log(chars)
        if(this.currentElement && chars){
            if (this.cdata) {
                var charNode = this.document.createCDATASection(chars);
                this.currentElement.appendChild(charNode);
            } else {
                var charNode = this.document.createTextNode(chars);
                this.currentElement.appendChild(charNode);
            }
            this.locator && position(this.locator,charNode)
        }
    },
    skippedEntity:function(name) {
    },
    endDocument:function() {
        this.document.normalize();
    },
    setDocumentLocator:function (locator) {
        if(this.locator = locator){// && !('lineNumber' in locator)){
            locator.lineNumber = 0;
        }
    },
    //LexicalHandler
    comment:function(chars, start, length) {
        chars = _toString.apply(this,arguments)
        var comm = this.document.createComment(chars);
        this.locator && position(this.locator,comm)
        appendElement(this, comm);
    },

    startCDATA:function() {
        //used in characters() methods
        this.cdata = true;
    },
    endCDATA:function() {
        this.cdata = false;
    },

    startDTD:function(name, publicId, systemId) {
        var impl = this.document.implementation;
        if (impl && impl.createDocumentType) {
            var dt = impl.createDocumentType(name, publicId, systemId);
            this.locator && position(this.locator,dt)
            appendElement(this, dt);
        }
    },
    /**
     * @see org.xml.sax.ErrorHandler
     * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
     */
    warning:function(error) {
        console.warn(error,_locator(this.locator));
    },
    error:function(error) {
        console.error(error,_locator(this.locator));
    },
    fatalError:function(error) {
        console.error(error,_locator(this.locator));
        throw error;
    }
}
function _locator(l){
    if(l){
        return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
    }
}
function _toString(chars,start,length){
    if(typeof chars == 'string'){
        return chars.substr(start,length)
    }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
        if(chars.length >= start+length || start){
            return new java.lang.String(chars,start,length)+'';
        }
        return chars;
    }
}

/*
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
 * used method of org.xml.sax.ext.LexicalHandler:
 *  #comment(chars, start, length)
 *  #startCDATA()
 *  #endCDATA()
 *  #startDTD(name, publicId, systemId)
 *
 *
 * IGNORED method of org.xml.sax.ext.LexicalHandler:
 *  #endDTD()
 *  #startEntity(name)
 *  #endEntity(name)
 *
 *
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
 * IGNORED method of org.xml.sax.ext.DeclHandler
 *  #attributeDecl(eName, aName, type, mode, value)
 *  #elementDecl(name, model)
 *  #externalEntityDecl(name, publicId, systemId)
 *  #internalEntityDecl(name, value)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
 * IGNORED method of org.xml.sax.EntityResolver2
 *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
 *  #resolveEntity(publicId, systemId)
 *  #getExternalSubset(name, baseURI)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
 * IGNORED method of org.xml.sax.DTDHandler
 *  #notationDecl(name, publicId, systemId) {};
 *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
 */
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
    DOMHandler.prototype[key] = function(){return null}
})

/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
function appendElement (hander,node) {
    if (!hander.currentElement) {
        hander.document.appendChild(node);
    } else {
        hander.currentElement.appendChild(node);
    }
}//appendChild and setAttributeNS are preformance key

if(typeof require == 'function'){
    var XMLReader = require('cloud/sax').XMLReader;
    var DOMImplementation = exports.DOMImplementation = require('cloud/dom').DOMImplementation;
    exports.XMLSerializer = require('cloud/dom').XMLSerializer ;
    exports.DOMParser = DOMParser;
}
函数DOMParser(选项){
this.options=options |{locator:{};
}
DOMParser.prototype.parseFromString=函数(源,mimeType){
var options=this.options;
var sax=新的XMLReader();
var domguilder=options.domguilder | | new DOMHandler();//contentHandler和LexicalHandler
var errorHandler=options.errorHandler;
变量定位器=options.locator;
var defaultNSMap=options.xmlns |{};
var entityMap={'lt':'','amp':'&','quot':','apos':''}
如果(定位器){
domBuilder.setDocumentLocator(定位器)
}
sax.errorHandler=buildErrorHandler(errorHandler、domBuilder、locator);
sax.domguilder=options.domguilder | | domguilder;
if(/\/x?html?$/.test(mimeType)){
entityMap.nbsp='\xa0';
entityMap.copy='\xa9';
defaultNSMap['']='http://www.w3.org/1999/xhtml';
}
如果(来源){
parse(source,defaultNSMap,entityMap);
}否则{
错误(“无效文档源”);
}
返回domBuilder.document;
}
函数buildErrorHandler(errorImpl、domBuilder、locator){
如果(!errorImpl){
if(DOMHandler的domBuilder实例){
返回domBuilder;
}
errorImpl=domBuilder;
}
var errorHandler={}
var isCallback=errorImpl instanceof函数;
定位器=定位器| |{}
功能构建(关键){
var fn=errorImpl[key];
如果(!fn){
if(isCallback){
fn=errorImpl.length==2?函数(msg){errorImpl(key,msg)}:errorImpl;
}否则{
var i=arguments.length;
而(--i){
if(fn=errorImpl[arguments[i]]{
打破
}
}
}
}
errorHandler[key]=fn&函数(msg){
fn(味精+_定位器(定位器));
}||函数(){};
}
构建('warning','warn');
生成('error'、'warn'、'warning');
生成('fatalError'、'warn'、'warning'、'error');
返回错误处理程序;
}
/**
*+ContentHandler+ErrorHandler
*+LexicalHandler+EntityResolver2
*-德克汉德勒-德克汉德勒
* 
*DefaultHandler:EntityResolver、DTDHandler、ContentHandler、ErrorHandler
*DefaultHandler2:DefaultHandler、LexicalHandler、DeclHandler、EntityResolve2
*@linkhttp://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
*/
函数DOMHandler(){
this.cdata=false;
}
功能位置(定位器、节点){
node.lineNumber=locator.lineNumber;
node.columnNumber=locator.columnNumber;
}
/**
*@see org.xml.sax.ContentHandler#startDocument
*@linkhttp://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
*/ 
DOMHandler.prototype={
startDocument:function(){
this.document=new dominimplementation().createDocument(null,null,null);
如果(这个定位器){
this.document.documentURI=this.locator.systemId;
}
},
startElement:函数(namespaceURI、localName、qName、attrs){
var doc=本文件;
var el=doc.createElements(namespaceURI,qName | | localName);
var len=属性长度;
附录元素(this,el);
此.currentElement=el;
this.locator和位置(this.locator,el)
对于(变量i=0;ifunction DOMParser(options){
    this.options = options ||{locator:{}};

}
DOMParser.prototype.parseFromString = function(source,mimeType){    
    var options = this.options;
    var sax =  new XMLReader();
    var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
    var errorHandler = options.errorHandler;
    var locator = options.locator;
    var defaultNSMap = options.xmlns||{};
    var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
    if(locator){
        domBuilder.setDocumentLocator(locator)
    }

    sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
    sax.domBuilder = options.domBuilder || domBuilder;
    if(/\/x?html?$/.test(mimeType)){
        entityMap.nbsp = '\xa0';
        entityMap.copy = '\xa9';
        defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
    }
    if(source){
        sax.parse(source,defaultNSMap,entityMap);
    }else{
        sax.errorHandler.error("invalid document source");
    }
    return domBuilder.document;
}
function buildErrorHandler(errorImpl,domBuilder,locator){
    if(!errorImpl){
        if(domBuilder instanceof DOMHandler){
            return domBuilder;
        }
        errorImpl = domBuilder ;
    }
    var errorHandler = {}
    var isCallback = errorImpl instanceof Function;
    locator = locator||{}
    function build(key){
        var fn = errorImpl[key];
        if(!fn){
            if(isCallback){
                fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
            }else{
                var i=arguments.length;
                while(--i){
                    if(fn = errorImpl[arguments[i]]){
                        break;
                    }
                }
            }
        }
        errorHandler[key] = fn && function(msg){
            fn(msg+_locator(locator));
        }||function(){};
    }
    build('warning','warn');
    build('error','warn','warning');
    build('fatalError','warn','warning','error');
    return errorHandler;
}
/**
 * +ContentHandler+ErrorHandler
 * +LexicalHandler+EntityResolver2
 * -DeclHandler-DTDHandler 
 * 
 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
 */
function DOMHandler() {
    this.cdata = false;
}
function position(locator,node){
    node.lineNumber = locator.lineNumber;
    node.columnNumber = locator.columnNumber;
}
/**
 * @see org.xml.sax.ContentHandler#startDocument
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
 */ 
DOMHandler.prototype = {
    startDocument : function() {
        this.document = new DOMImplementation().createDocument(null, null, null);
        if (this.locator) {
            this.document.documentURI = this.locator.systemId;
        }
    },
    startElement:function(namespaceURI, localName, qName, attrs) {
        var doc = this.document;
        var el = doc.createElementNS(namespaceURI, qName||localName);
        var len = attrs.length;
        appendElement(this, el);
        this.currentElement = el;

        this.locator && position(this.locator,el)
        for (var i = 0 ; i < len; i++) {
            var namespaceURI = attrs.getURI(i);
            var value = attrs.getValue(i);
            var qName = attrs.getQName(i);
            var attr = doc.createAttributeNS(namespaceURI, qName);
            if( attr.getOffset){
                position(attr.getOffset(1),attr)
            }
            attr.value = attr.nodeValue = value;
            el.setAttributeNode(attr)
        }
    },
    endElement:function(namespaceURI, localName, qName) {
        var current = this.currentElement
        var tagName = current.tagName;
        this.currentElement = current.parentNode;
    },
    startPrefixMapping:function(prefix, uri) {
    },
    endPrefixMapping:function(prefix) {
    },
    processingInstruction:function(target, data) {
        var ins = this.document.createProcessingInstruction(target, data);
        this.locator && position(this.locator,ins)
        appendElement(this, ins);
    },
    ignorableWhitespace:function(ch, start, length) {
    },
    characters:function(chars, start, length) {
        chars = _toString.apply(this,arguments)
        //console.log(chars)
        if(this.currentElement && chars){
            if (this.cdata) {
                var charNode = this.document.createCDATASection(chars);
                this.currentElement.appendChild(charNode);
            } else {
                var charNode = this.document.createTextNode(chars);
                this.currentElement.appendChild(charNode);
            }
            this.locator && position(this.locator,charNode)
        }
    },
    skippedEntity:function(name) {
    },
    endDocument:function() {
        this.document.normalize();
    },
    setDocumentLocator:function (locator) {
        if(this.locator = locator){// && !('lineNumber' in locator)){
            locator.lineNumber = 0;
        }
    },
    //LexicalHandler
    comment:function(chars, start, length) {
        chars = _toString.apply(this,arguments)
        var comm = this.document.createComment(chars);
        this.locator && position(this.locator,comm)
        appendElement(this, comm);
    },

    startCDATA:function() {
        //used in characters() methods
        this.cdata = true;
    },
    endCDATA:function() {
        this.cdata = false;
    },

    startDTD:function(name, publicId, systemId) {
        var impl = this.document.implementation;
        if (impl && impl.createDocumentType) {
            var dt = impl.createDocumentType(name, publicId, systemId);
            this.locator && position(this.locator,dt)
            appendElement(this, dt);
        }
    },
    /**
     * @see org.xml.sax.ErrorHandler
     * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
     */
    warning:function(error) {
        console.warn(error,_locator(this.locator));
    },
    error:function(error) {
        console.error(error,_locator(this.locator));
    },
    fatalError:function(error) {
        console.error(error,_locator(this.locator));
        throw error;
    }
}
function _locator(l){
    if(l){
        return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
    }
}
function _toString(chars,start,length){
    if(typeof chars == 'string'){
        return chars.substr(start,length)
    }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
        if(chars.length >= start+length || start){
            return new java.lang.String(chars,start,length)+'';
        }
        return chars;
    }
}

/*
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
 * used method of org.xml.sax.ext.LexicalHandler:
 *  #comment(chars, start, length)
 *  #startCDATA()
 *  #endCDATA()
 *  #startDTD(name, publicId, systemId)
 *
 *
 * IGNORED method of org.xml.sax.ext.LexicalHandler:
 *  #endDTD()
 *  #startEntity(name)
 *  #endEntity(name)
 *
 *
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
 * IGNORED method of org.xml.sax.ext.DeclHandler
 *  #attributeDecl(eName, aName, type, mode, value)
 *  #elementDecl(name, model)
 *  #externalEntityDecl(name, publicId, systemId)
 *  #internalEntityDecl(name, value)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
 * IGNORED method of org.xml.sax.EntityResolver2
 *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
 *  #resolveEntity(publicId, systemId)
 *  #getExternalSubset(name, baseURI)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
 * IGNORED method of org.xml.sax.DTDHandler
 *  #notationDecl(name, publicId, systemId) {};
 *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
 */
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
    DOMHandler.prototype[key] = function(){return null}
})

/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
function appendElement (hander,node) {
    if (!hander.currentElement) {
        hander.document.appendChild(node);
    } else {
        hander.currentElement.appendChild(node);
    }
}//appendChild and setAttributeNS are preformance key

if(typeof require == 'function'){
    var XMLReader = require('cloud/sax').XMLReader;
    var DOMImplementation = exports.DOMImplementation = require('cloud/dom').DOMImplementation;
    exports.XMLSerializer = require('cloud/dom').XMLSerializer ;
    exports.DOMParser = DOMParser;
}