2012-01-04 9 views
2

私がXmlSlurperで汚れたHTMLページを解析していますを使用するときに問題のある行を見つけ、私は次のエラーを取得する方法:今XmlSlurper

ERROR org.xml.sax.SAXParseException: Element type "scr" must be followed by either attribute specifications, ">" or "/>". 
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
     ... 
[Fatal Error] :1157:22: Element type "scr" must be followed by either attribute specifications, ">" or "/>". 

を、私は私はそれをHTMLを供給し、その前にそれを印刷しています。私がそれを開き、エラー1157に記載されている行に移動しようとすると、そこには「src」はありません(しかし、ファイルにはこのような文字列が何百もあります)。だから、私はいくつかの追加のものが挿入されている(おそらく<script>またはそのようなもの)行番号を変更すると思います。

問題のある行やhtmlを正確に見つける良い方法はありますか?

+0

「scr」というエラーは、「src」が見つからないということです。それはタイプミスですか、あるいは間違ったことを文書で検索していますか? –

+0

NekoHTMLが見つかるまでTagSoupを使いました。私は正確な理由を覚えていませんが、TagSoupは機能していませんでした。ここでNekoHTMLを使用する方法の例を見ることができます - http://stackoverflow.com/questions/9260461/gpath-to-find-if-a-table-header-contains-a-matching-string – Gaurav

答えて

0

あなたはどちらのSAXパーサーを使用していますか? HTMLは厳密なXMLではないため、XMLSlurperをデフォルトのパーサで使用すると、エラーが継続する可能性があります。

「Groovy html slurper」の大雑把なgoogle検索では、TagSoupというSaxParserを指すHTML Scraping With Groovyにつながっていました。

渦を作って、汚れたページを解析するかどうかを確認します。

+0

ありがとう、私はすでにTagsoupを試して、どこにも行きませんでした。私のコードは、何日か前に私が取り込んだページが何か変わったときまで、デフォルトのパーサを使ってXmlSlurperで正常に動作していました。 XmlSlurperを使用する前に、問題のコードを自分で修正しました。問題は今、問題の原因を見つけることができません。 – Persimmonium

+0

私の質問に対する答えではありませんが、私はこれを受け入れています。しかし、私はTagsoupにもう一度行って、今度はうまく働いた – Persimmonium

0

各要素に_lineNumという名前の属性を追加して使用できます。

import org.xml.sax.Attributes; 
import org.xml.sax.Locator; 
import org.xml.sax.SAXException; 
import org.xml.sax.ext.Attributes2Impl; 
import javax.xml.parsers.ParserConfigurationException; 

class MySlurper extends XmlSlurper {  
    public static final String LINE_NUM_ATTR = "_srmLineNum" 
    Locator locator 

    public MySlurper() throws ParserConfigurationException, SAXException { 
     super(); 
    } 

    @Override 
    public void setDocumentLocator(Locator locator) { 
     this.locator = locator; 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { 
     Attributes2Impl newAttrs = new Attributes2Impl(attrs);   
     newAttrs.addAttribute(uri, LINE_NUM_ATTR, LINE_NUM_ATTR, "ENTITY", "" + locator.getLineNumber());   
     super.startElement(uri, localName, qName, newAttrs); 
    } 
} 

def text = ''' 
<root> 
    <a>one!</a> 
    <a>two!</a> 
</root>''' 

def root = new MySlurper().parseText(text) 

root.a.each { println [email protected]_srmLineNum } 

上記の行番号属性が追加されています。おそらく、ロケータから行番号を読み取ることができる独自のエラーハンドラを設定しようとする可能性があります。

関連する問題