当前位置: 首页 > 知识库问答 >
问题:

使用xpath从格式不好的页面解析XML

司空坚
2023-03-14

注意:在写这个问题时,我注意到有一个Github API可以在不进行HTML解析的情况下解决我的问题:https://api.github.com/repos/mozilla/geckodriver/releases/latest我决定问它,因为我知道如何解决所描述的解析格式错误的HTML本身的问题。所以请不要投反对票,因为有一个github API!我们可以用任何其他页面抛出验证错误来替换github。

我想下载geckodriver的最新版本。通过获取最新标记的重定向目标,我进入了发布页面

curl $(curl -s "https://github.com/mozilla/geckodriver/releases/latest" --head | grep -i location | awk '{print $2}' | sed 's/\r//g') > /tmp/geckodriver.html

使用geckodriver vx的第一批资产。xxx-linux64。焦油gz是必需的链接。因为XML是schemantic,所以应该正确地解析它。像xmllint这样的不同工具可以使用XPath解析它。因为xpath对我来说是新的,所以我尝试了一个简单的头部查询。但是xmllint抛出了很多错误:

$ xmllint --xpath '//div[@class=Header]' /tmp/geckodriver.html
/tmp/geckodriver.html:51: parser error : Specification mandate value for attribute data-pjax-transient
  <meta name="selected-link" value="repo_releases" data-pjax-transient>
                                                                      ^
/tmp/geckodriver.html:107: parser error : Opening and ending tag mismatch: link line 105 and head
  </head>
         ^
/tmp/geckodriver.html:145: parser error : Entity 'nbsp' not defined
                Sign&nbsp;up
                          ^
/tmp/geckodriver.html:172: parser error : Entity 'rarr' not defined
es <span class="Bump-link-symbol float-right text-normal text-gray-light">&rarr;
...

还有很多。github页面似乎没有按照规范的要求正确构建。我还尝试了xmlstarlet

xmlstarlet sel -t -v -m '//div[@class=Header]' /tmp/geckodriver.html

但结果是相似的。

当超文本标记语言没有很好地形成时,是否不可能使用这些工具提取一些数据?

共有1个答案

乜元魁
2023-03-14

curl$(curl-s"https://github.com/mozilla/geckodriver/releases/latest"--head|grep-i位置|awk'{print 2美元}'|se's/\r//g')

使用-L可能更简单,并让curl遵循重定向:

curl -L https://github.com/mozilla/geckodriver/releases/latest

然后,xmllint接受一个--html参数,以使用html解析器:

xmllint --html --xpath '//div[@class=Header]'

然而,这与该页面上的任何内容都不匹配,因此您可能希望将XPath基于以下内容:

'string((//a[span[contains(.,"linux")]])[1]/@href)'

其产生:

/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux32.tar.gz

 类似资料:
  • 然后我在Jsoup as中将xpath转换为CSS查询,以便稍后提取特定元素: 代码的执行没有正确定位我,而是定位到Firebug在XPath中引用的元素: 从最后来看,第一个区别是: 有没有任何替代Jsoup的方法可以处理这类问题?

  • 问题内容: 使用C#我想知道如何从此示例html脚本获取Textbox值(即:john): 问题答案: 有多种方法可以使用敏捷包来选择元素。 假设我们定义如下: 1.简单的LINQ 我们可以使用该方法,传递我们正在寻找的元素的名称: 2.更高级的LINQ 我们可以通过使用 更先进的LINQ 来缩小范围: 3. XPath 或者我们可以使用XPath。

  • 问题内容: 我想使用Javascript 解析此内容。数据如下所示: 在线上的每个教程都教您如何使用Twitter解析JSON,但是我不太确定如何使用JSON解析。 我想在一个网站上进行设置,以查看NFL团队在一个有趣的项目中获得的分数,以及有关解析JSON的良好学习体验,因为我不太在乎Twitter的东西。 这可能吗?有什么好的入门教程吗?甚至一些起始代码? 问题答案: 一般来说,您可以使用 J

  • 问题内容: 我正在使用Node.js进行一些Web抓取。我想使用XPath,因为我可以使用几种GUI半自动生成它。问题是我找不到有效的方法。 非常慢。它会在一分钟左右的时间内解析500KiB文件,并具有完整的CPU负载和大量内存。 流行的HTML解析库(例如)既不支持XPath,也不公开W3C兼容的DOM。 很明显,有效的HTML解析是在WebKit中实现的,因此可以使用或将其作为一种选择,但这些

  • 跨平台的INI解析器:SimpleINI,支持section,读、写、各种value,遍历等。代码有注释. [Code4App.com]

  • 问题内容: 我需要解析(服务器端)大量的HTML页面。 我们都同意,regexp不是行之有效的方法。 在我看来,javascript是解析HTML页面的本机方式,但是这种假设取决于服务器端代码,该代码具有javascript在浏览器内部具有的所有DOM功能。 Node.js是否具有内置的功能? 有没有更好的方法来解决此问题,请在服务器端解析HTML? 问题答案: 您可以使用npm模块jsdom和h