我正试图用这种结构抓取一个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选择器。
答案 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>