как найти оскорбительную строку при использовании XmlSlurper - PullRequest
2 голосов
/ 05 января 2012

Я анализирую грязную 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?

Ответы [ 2 ]

0 голосов
/ 31 мая 2016

Вы можете добавить атрибут с именем _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 it.@_srmLineNum }

Выше добавлен атрибут строки num.Возможно, вы можете попытаться установить свой собственный обработчик ошибок, который может читать номер строки из локатора.

0 голосов
/ 05 января 2012

Какой SAXParser вы используете?HTML не является строгим XML, поэтому использование XMLSlurper с парсером по умолчанию, вероятно, приведет к продолжительным ошибкам.

Беглый поиск в Google по запросу "Groovy html slurper" привел меня к Соскребанию HTML с Groovy который указывает на SaxParser с именем TagSoup .

Дайте этому вихрь и посмотрите, анализирует ли он грязную страницу.

...