6

我已经在这几个小时了,我无法取得任何进展。我不知道如何执行以下操作,我习惯于数组和循环,而不是 nokogiri 对象。

我想在包含 id == "filmography" 的跨度 h2 之后立即选择表格元素

<h2><span id ="filmography>...
<table>  # What I want to find
  <tr>
    <td>...

到目前为止,我已经使用

objects = page.xpath("//h2" | "//table")

拥有一个 nokogiri 对象数组,我测试每个对象的 id == "Filmography" 并与下一个对象一起工作,但是返回的元素不是按顺序显示在页面上的,它们的顺序是所有 h2,然后是所有表.

我能否以某种方式将所有“h2”和“表”按照它们在页面上出现的顺序作为元素对象,并测试子对象“跨度”的 id 属性?

所有建议都表示赞赏,因为我完全陷入困境。

4

2 回答 2

5

This looks like it should work:

page.xpath('h2//span[@id="filmography"]').first.next_element
于 2013-11-05T23:15:39.957 回答
1

Nokogiri 支持 CSS 选择器,这使得这很容易:

doc.at('span#filmography table').to_html
=> "<table><tr>\n<td>...</td>\n    </tr></table>"

doc.at('#filmography table').to_html
=> "<table><tr>\n<td>...</td>\n    </tr></table>"

at使用 CSS 或 XPath 选择器返回第一个匹配节点。

等效的“NodeSet”是search,它返回一个 NodeSet,它就像一个数组,但会强制你first在它之后使用,这只会产生更长的命令:

doc.search('span#filmography table').first.to_html
doc.search('#filmography table').first.to_html

因为span标签包含一个id参数,所以您可以安全地使用at并且只查找#filmography,因为 ID 在页面中是唯一的。

于 2013-11-06T04:24:50.843 回答