我的目标是从网页中获取特定的文本区域。想象一下,就好像您能够在页面上的任何位置绘制一个矩形,并且该矩形中的所有内容都将被复制到剪贴板中。我正在使用 FireBug(请随意建议其他解决方案,我已经搜索了插件或书签,但没有找到任何有用的东西)及其控制台窗口和 XPath 用于此目的。我想要获取的值采用以下格式(这是从 FireBug“HTML 检查”观察到的):
<span class="number3_0" title="Numbers">3.00</span>
所以我最终得到以下代码,这是我从 FireBug 控制台发出的:$x("//span[@title='Numbers']/text()")
之后我得到这样的东西:
[<TextNode textContent="2.00">, <TextNode textContent="2.00">, <TextNode textContent="2.00">, <TextNode textContent="2.00">, <TextNode textContent="3.00">]
之后我单击(用鼠标右键)[
并选择Inspect in DOM panel
然后我按ctrl+a
并按以下格式复制/粘贴数据:
0 <TextNode textContent="2.00">
1 <TextNode textContent="2.00">
2 <TextNode textContent="2.00">
3 <TextNode textContent="2.00">
4 <TextNode textContent="3.00">
正如您可以假设的值textContent
是我感兴趣的信息。我尝试修改原始 XPath 查询以仅返回这些数字,但没有成功。我曾是:
将整个查询包装成string()
正如这里所建议的Xpath - 仅获取节点内容而没有其他元素 https://stackoverflow.com/questions/4455684/xpath-get-only-node-content-without-other-elements
试图弄清楚这个是如何工作的通过 XPath 提取节点之间的文本 https://stackoverflow.com/questions/10182587/extracting-text-in-between-nodes-through-xpath还有更多。
为了能够获得所需的值,我使用了一些 bash 脚本 + xml 格式,在这个繁琐/容易出错的任务之后,我得到以下格式:
<?xml version="1.0"?>
<head>
<TextNode textContent="2.00"/>
<TextNode textContent="2.00"/>
<TextNode textContent="2.00"/>
<TextNode textContent="2.00"/>
<TextNode textContent="3.00"/>
<TextNode textContent="3.00"/>
</head>
现在我用xmlstarlet
通过以下方式获取这些值(是的,我知道我可以在上一步中使用 regexp 并拥有我需要的所有数据。但我对 DOM/XPath 解析很感兴趣,并试图弄清楚它是如何工作的):
cat input | xmlstarlet sel -t -m "//TextNode" -v 'concat(@textContent,"
")'
这最终给了我想要的输出:
2.00
2.00
2.00
2.00
3.00
我的问题有点笼统:
- 这个可怕的漫长过程如何自动化?
- 如何修改 FireBug 中使用的原始 XPath 字符串
$x("//span[@title='Numbers']/text()")
立即获得仅
数字并节省剩下的步骤?
-
我还是不太熟悉xmlstarlet
,特别是选择
(sel
)模式让我发疯。我见过各种组合
以下选项:
-c 或 --copy-of - 打印 XPATH 表达式的副本
-v 或 --value-of - 打印 XPATH 表达式的值
-o 或 --output - 输出字符串文字
-m 或 --match - 匹配 XPATH 表达式
有人可以解释一下何时使用哪一个吗?如果可能的话,我们很高兴看到具体的例子。如果感兴趣的话,有提到的选项的各种组合,我不太理解:http://www.grahl.ch/blog/minutiae-return-content-element-xmlstarlet http://www.grahl.ch/blog/minutiae-return-content-element-xmlstarlet
使用 xmlstarlet 提取和转储元素 https://stackoverflow.com/questions/1890690/extracting-and-dumping-elements-using-xmlstarlet/1897283#1897283
测试 XML 属性 https://stackoverflow.com/questions/5580372/testing-for-an-xml-attribute/
4.) 最后一个问题是关于xmlstarlet
是一个有点装饰性的语法糖,如何获得漂亮的换行符分隔输出,正如你所看到的,我通过添加换行符作为分隔符来“作弊”,但是当我尝试使用这样的转义字符时:
cat input | xmlstarlet sel -t -m "//TextNode" -v 'concat(@textContent,"\n")'
它不起作用,而且我从中学到很多东西的原始参考资料也以这种“丑陋”的方式使用它http://www.ibm.com/developerworks/library/x-starlet/index.html http://www.ibm.com/developerworks/library/x-starlet/index.html
PS:也许所有这些步骤都可以使用curl + xmlstarlet 来简化,但是对于需要登录或其他内容的页面也可以使用FireBug 选项,这可能会很方便。
感谢您的所有想法。