作者:一个人失忆9988_347_289 | 来源:互联网 | 2023-05-25 13:11
我试图解析用的XmlSlurper非格式良好的HTML页面,Eclipse的下载网站的W3C验证显示在页面中的几个误区.
我在这篇文章中尝试了容错解析器
@Grab(group='net.sourceforge.nekohtml', module='nekohtml', version='1.9.14')
import org.cyberneko.html.parsers.SAXParser
import groovy.util.XmlSlurper
// Getting the xhtml page thanks to Neko SAX parser
def mirrors = new XmlSlurper(new SAXParser()).parse("http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/luna/SR1a/eclipse-jee-luna-SR1a-linux-gtk-x86_64.tar.gz")
mirrors.'**'
不幸的是,看起来并非所有内容都被解析为XML对象.有缺陷的子树被忽略了.
例如,page.depthFirst().find { it.text() == 'North America'}
返回null
而不是页面中的H4元素.
是否有一些强大的方法来解析groovy中的任何HTML内容?
1> Opal..:
使用以下代码,它可以很好地解析(没有错误):
@Grab(group='net.sourceforge.nekohtml', module='nekohtml', version='1.9.14')
import org.cyberneko.html.parsers.SAXParser
import groovy.util.XmlSlurper
def parser = new SAXParser()
def page = new XmlSlurper(parser).parse('http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/luna/SR1a/eclipse-jee-luna-SR1a-linux-gtk-x86_64.tar.gz')
但是我不知道你想找到哪些元素.
这里All mirrors
找到:
page.depthFirst().find {
it.text() == 'All mirrors'
}.@href
编辑
两个输出都是null
.
println page.depthFirst().find { it.text() == 'North America'}
println page.depthFirst().find { it.text().contains('North America')}
编辑2
下面您可以找到一个下载文件并正确解析它的工作示例.我wget
以前下载文件(用groovy下载它有问题 - 不知道是什么)
@Grab(group='net.sourceforge.nekohtml', module='nekohtml', version='1.9.14')
import org.cyberneko.html.parsers.SAXParser
import groovy.util.XmlSlurper
def host = 'http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/luna/SR1a/eclipse-jee-luna-SR1a-linux-gtk-x86_64.tar.gz'
def temp = File.createTempFile('eclipse', 'tmp')
temp.deleteOnExit()
def cmd = ['wget', host, '-O', temp.absolutePath].execute()
cmd.waitFor()
cmd.exitValue()
def parser = new SAXParser()
def page = new XmlSlurper(parser).parseText(temp.text)
println page.depthFirst().find { it.text() == 'North America'}
println page.depthFirst().find { it.text().contains('North America')}
编辑3
最后问题解决了.url.toURL().text
当没有User-Agent
指定标题时,使用groovy 会导致问题.现在它可以正常工作并找到元素 - 不使用外部工具.
@Grab(group='net.sourceforge.nekohtml', module='nekohtml', version='1.9.14')
import org.cyberneko.html.parsers.SAXParser
import groovy.util.XmlSlurper
def host = 'http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/luna/SR1a/eclipse-jee-luna-SR1a-linux-gtk-x86_64.tar.gz'
def parser = new SAXParser()
def page = new XmlSlurper(parser).parseText(host.toURL().getText(requestProperties: ['User-Agent': 'Non empty']))
assert page.depthFirst().find { it.text() == 'North America'}
assert page.depthFirst().find { it.text().contains('North America')}