我需要从HTML文件中提取信息。对于大多数人来说,我只需要匹配特定DOM元素的内容或属性,因此我使用XPATH表达式,如//a[@class="targeturl"]/@href
和命令行工具xidel。
在不同批次的文件中,我想要的信息位于script
,不太容易获得:
<html>
<head><!-- ... --></head>
<body>
...
<script>
...
var o = {
"numeric": 1234,
"target": "TARGET",
"urls": "http://example.com",
// Commented pair "strings": "...",
"arrays": [
{
"more": true
}
,
{
"itgoeson": true
}
]
};
</script>
...
</body>
</html>
请注意,包含我想要获取的值的对象不是有效的JSON。但是,它似乎每行都要尊重一个键值对。
我可以传递给xidel --xpath "???"
以获取此TARGET
的内容?
我尝试过与XPATH功能不同的东西,但是我无法找到解决方案而没有管道其他命令(match
告诉我是/否,replace
正常工作线......等。
答案 0 :(得分:1)
尝试在XPath下面实现:
substring-before(substring-after(//script, '"target": '), ",")
答案 1 :(得分:1)
我可以传递给
xidel --xpath "???"
以获取此TARGET
?
由于var o
实际上是JSON,我建议你这样对待:
-e "json(
//script/extract(
.,
'var o = (.+);',
1,'s'
)[.]
)/target"
{"field1": 1234, "target": "TARGET", "morefields": "..."}
元素节点中提取<script>
(json包含多行,因此请勿忘记's'
正则表达式标记。)json(
)
包裹在其周围(或//script/...[.] ! json(.)
)并选择target
属性。 <强> [编辑] 强>
要删除评论(以//
开头):
-e "json(
//script/replace(
extract(
.,
'var o = (.+);',
1,'s'
)[.],
'\s+//.+',
''
)
)/target"
不是最讨人喜欢的查询,但它确实有效 的 [/编辑] 强>