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

问题描述 投票:0回答:1

Notice:在写这个问题时,我注意到有一个Github API可以解决我的问题而不进行HTML解析:https://api.github.com/repos/mozilla/geckodriver/releases/latest我决定还是要问这个问题,因为我已经证明了如何解决所描述的解析格式错误的HTML本身的问题。所以请dont downvote,因为有一个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.tar.gz的第一项资产是必需的链接。由于XML是模式化的,因此应正确解析。 Different tools like xmllint可以使用xmllint对其进行解析。由于xpath对我来说是新的,因此我尝试了对标头的简单查询。但是xpaths会引发很多错误:

xmllint

还有很多。似乎github页面的格式不正确,这是规范要求的。我也尝试过$ 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; ...

xmlstarlet

但结果相似。

当HTML格式不正确时,是否可以使用那些工具提取某些数据?

html bash xpath xmlstarlet xmllint
1个回答
0
投票

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

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

use -L, and have curl follow the redirection

然后,-L curl,使用HTML解析器:

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

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

xmllint

哪个产量:

accepts an --html argument
© www.soinside.com 2019 - 2024. All rights reserved.