我遇到了如何从当前元素中查找第一级子元素的问题? 例如我有 html :
<table>
<tr>abc</tr>
<tr>def</tr>
<table>
<tr>second</tr>
</table>
</table>
我正在使用 Nokogiri 作为轨道:
table = page.css('table')
table.css('tr')
它返回
tr
内的所有 table
。
但我只需要 2 个第一层的桌子。
当你说这句话时:
table = page.css('table')
您将抓住两张桌子,而不仅仅是顶层桌子。因此,您可以返回到文档根目录并使用仅匹配第一个表中的行的选择器,如 mosch 所说,或者您可以将
table
修复为仅包含以下内容的外表:
table = page.css('table').first
trs = table.xpath('./tr')
甚至是这个(取决于 HTML 的实际结构):
table = page.xpath('/html/body/table')
trs = table.xpath('./tr')
或者可能是其中之一
table
(再次感谢 Phrogz):
table = page.at('table')
table = page.at_css('table')
# or various other CSS and XPath incantations
你可以做
rows = page.css('body > table > tr')
也许您必须使选择器适应您的容器元素(我在这里选择“body”)
还有另一种方法,你可以尝试使用这样的东西:
text = <<HERE
<table>
<tr>abc</tr>
<tr>def</tr>
<table>
<tr>second</tr>
</table>
</table>
HERE
xml = Nokogiri::XML(text)
xml.xpath("/table/tr/").each do |node|
puts node.text
end
在此示例中,“/table/tr”表达式表示所需元素的绝对路径 - 在我们的示例中为“tr”。
你愿意尝试这个吗?
tables = doc.css('table')
tables.each do |table|
rows = table.css('tr')
rows.each do |row|
if row.parent == table
# Some action here...
end
end
end