gpt4 book ai didi

html - 如何使用 XmlSlurper 解析格式不正确的 HTML

转载 作者:搜寻专家 更新时间:2023-10-31 02:25:58 27 4
gpt4 key购买 nike

我正在尝试使用 XmlSlurper 解析格式不正确的 HTML 页面,the Eclipse download site W3C validator在页面中显示多个错误。

我尝试了 this 中的容错解析器发布

@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 内容?

最佳答案

使用以下代码可以很好地解析(没有错误):

@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')

但是我不知道你到底想找哪些元素。

在这里找到所有镜像:

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

问题终于解决了。如果未指定 User-Agent header ,使用 groovy 的 url.toURL().text 会导致问题。现在它可以正常工作并找到元素 - 没有使用外部工具。

@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')}

关于html - 如何使用 XmlSlurper 解析格式不正确的 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28110181/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com