我正在尝试从HTML页面获取一些内容。在这里,我将HTML分成几个部分,并使用Nokogiri解析每个子部分。
当我使用CSS选择器时,它与XPath选择器所在的子部分不匹配:
#!/usr/bin/ruby
require 'nokogiri'
# construct simple HTML
doc = Nokogiri::HTML('<div><h3>Heading</h3></div>')
puts doc, "n"
# get the div
div = doc.at_css('div')
puts div, "n"
# get heading using XPath and CSS. CSS doesn't match!
puts "XPath: ", div.at_xpath('//div/h3[1]') || "no match"
puts "CSS: ", div.at_css('div > h3') || "no match"
输出:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div><h3>Heading</h3></div></body></html>
<div><h3>Heading</h3></div>
XPath:
<h3>Heading</h3>
CSS:
no match
正如您所看到的,在CSS部分没有匹配项。那么,为什么表达式div > h3
不匹配呢?我应该为div
变量创建一个新的Nokogiri::HTML
吗(如果我将其用于包含许多子部件的大型文档,可能会出现性能问题)?或者用另一个元素包裹它,使<div>
不是根元素?
xpath中的//
从根的均值;xpath表达式//...
从根目录中查找元素,即使您发出div.at_xpath
。。
另一方面,div.at_css
从div
标签中找到;没有对手。
div > h3
(css)不同于//div/h3[1]
(xpath)。
div > h3
(css)类似于.//div/h3[1]
(xpath)。