2012-01-04 4 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

어떤 SAXParser를 사용하고 있습니까? 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 } 

위의 코드는 num 속성을 추가합니다. 아마도 로케이터에서 행 번호를 읽을 수있는 자체 오류 처리기를 설정하려고 할 수 있습니다.