用于元素组的CSS选择器?

时间:2011-06-07 22:56:24

标签: ruby screen-scraping css-selectors

我正试图用这种结构抓取一个HTML网站:

<a name="how"></a>
<div class="ignore"></div>
<p>...</p>
<p>...</p>
<p>...</p>
<h3>...</h3>
<p>...</p>
<ul>...</ul>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<a name="other-uses"></a>

我需要抓住两个[name]锚元素之间的所有 p,h3和ul 标记。

现在我成功抓住了第一个p:

a[name='how'] + div + p

但我不确定如何抓住两者之间的所有元素。

这是在ScrAPI ruby scraping library内使用,它接受所有有效的CSS选择器。

1 个答案:

答案 0 :(得分:2)

我不相信这可以在一个CSS选择器中完成,但是很容易被证明是错误的。

可以在单个XPath表达式中完成:

//*[preceding-sibling::a/@name="how" and following-sibling::a/@name="other-uses"]

因此,如果备选的抓取库是一个选项,例如Mechanize(使用Nokogiri,一个符合XPath的HTML解析器),那么可以使用上面的XPath来完成。

编辑:为了完整性,这是一个功能完备的脚本,使用Nokogiri HTML解析器演示xpath。

require 'rubygems'
require 'nokogiri'

html =<<ENDOFHTML
<html>
<body>
    <a name="how"></a>
    <div class="ignore"></div>
    <p>...</p>
    <p>...</p>
    <p>...</p>
    <h3>...</h3>
    <p>...</p>
    <ul>...</ul>
    <p>...</p>
    <p>...</p>
    <p>...</p>
    <p>...</p>
    <a name="other-uses"></a>
</body>
</html>
ENDOFHTML

doc = Nokogiri::HTML.parse(html)

puts doc.xpath('//*[preceding-sibling::a/@name="how" and following-sibling::a/@name="other-uses"]')

结果:

<div class="ignore"></div>
<p>...</p>
<p>...</p>
<p>...</p>
<h3>...</h3>
<p>...</p>
<ul>...</ul>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>