我正在使用XmlSlurper解析一个脏的html页面,我收到以下错误:
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 :(得分:0)
您使用的是哪个SAXParser? HTML不是严格的XML,因此将XMLSlurper与默认解析器一起使用可能会导致持续的错误。
粗略的谷歌搜索“Groovy html slurper”导致我HTML Scraping With Groovy指向名为TagSoup的SaxParser。
给它一个旋转,看看它是否解析了脏页。
答案 1 :(得分: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 it.@_srmLineNum }
以上添加了行号属性。您也许可以尝试设置自己的错误处理程序,它可以从定位器中读取行号。