我遇到了nokogiri和xpath的奇怪问题.我想解析一个HTML文档,并通过href值和它们包含的锚文本获取所有链接.
到目前为止这是我的xpath:
xpath = "//a[contains(text(), #{link['anchor_text']}) and @href='#{link['target_url']}']" a = doc.search(xpath)
只要link ['anchor_text']是没有数字的字符串,这就可以正常工作.
如果我试图获取锚文本"11example"的链接,则会抛出以下错误:
Invalid expression: //a[contains(text(), 11example) and @href='http://www.example.com/']
也许这只是一个愚蠢的错误,但我不明白为什么会出现这种错误.如果我在xpath中围绕#{link ['anchor_text']}添加一些引号,那么什么都不起作用.
编辑:这是示例HTML:
Example.com Here is some text
11exampleSome text here and thereAnother text
example.comSome text here and there
Edit2:如果我在irb控制台中手动运行这些查询,一切都按预期工作,但前提是我将文本放在引号中.
提前致谢!
亲切的问候,madhippie
简单的答案就是你错过了周围的报价#{link['anchor_text']}
,就像你身边的一样#{link['target_url']}
.完整的XPath应该是
xpath = "//a[contains(text(), '#{link['anchor_text']}') and @href='#{link['target_url']}']"
当您不以数字开头时它似乎工作(至少不产生错误)的原因是该字符串被解释为节点查询.例如,Nokogiri正在寻找在标签<example.com>
内部命名的<a>
标签,然后将其转换为字符串,并查看<a>
标签的文本节点是否包含该字符串.如果标签不存在(如本例所示),则结果contains
始终为true.
作为演示,使用HTML:
<a href="example.com"><q>foo</q>example</a>
<a href="example.com"><q>foo</q>foo</a>
<a href="example.com">foo</a>
然后是查询
doc.search("//a[contains(text(), q)]")
与第一个<a>
标记不匹配,但与第二个和第三个标记匹配.
当字符串以数字开头时,它不能被解析为节点查询,因为以数字开头的名称不是有效的XML(或HTML)元素名称,因此您会收到错误.