机械化不通过CSS选择器方法识别锚标签

时间:2010-02-10 00:02:49

标签: ruby-on-rails css nokogiri mechanize screen-scraping

(希望这不违反礼仪:我在RailsForum上发布了这个,但我最近没有得到很多回复。)

还有其他人遇到过Mechanize无法通过CSS选择器识别锚标签的问题吗?

HTML看起来像这样(为清晰起见,删除了空格的代码段):

<td class='calendarCell' align='left'>
<a href="http://www.mysite.org/index.php/site/ActivitiesCalendar/2010/02/10/">10</a>
<p style="margin-bottom:15px; line-height:14px; text-align:left;">
<span class="sidenavHeadType">
 Current Events</span><br />
<b><a href="http://www.mysite.org/index.php/site/
Clubs/banks_and_the_fed" class="a2">Banks and the Fed</a></b>
<br />
10:30am- 11:45am
</p>

我正在尝试从这些事件中收集数据。除了在<p>内获得锚点外,一切正常。 <a>内部显然有一个<b>标记,我需要关注该链接以获取有关此事件的更多详细信息。

在我的佣金任务中,我有:

agent.page.search(".calendarCell,.calendarToday").each do |item|
  day = item.at("a").text

  item.search("p").each do |e|
    anchor   = e.at("a")
    puts anchor
    puts e.inner_html

  end
end

有趣的是item.at(“a”)总是返回锚点。但是e.at(“a”)返回nil。当我在p元素上执行inner_html时,它会完全忽略锚点。示例输出:

nil

<span class="sidenavHeadType">
 Photo Club</span><br><b>Indexing Slide Collections</b>
<br>
2:00pm- 3:00pm

然而,当我直接用Nokogiri进行同样的刮擦时:

doc.css(".calendarCell,.calendarToday").each do |item|
  day = item.at_css("a").text
  item.css("p").each do |e|
    link     = e.at_css("a")[:href]
    puts e.inner_html
  end
end

它识别

内部,它将返回href等。

<span class="sidenavHeadType">
 Bridge Party</span><br><b><a href="http://www.mysite.org/index.php/site/Clubs/party_bridge_51209" class="a2">Party Bridge</a></b>
<br>
7:00pm- 9:00pm

机械化应该使用Nokogiri,所以我想知道我是否有一个糟糕的版本,或者这是否会影响其他人。

感谢任何线索。

1 个答案:

答案 0 :(得分:1)

没关系。误报。在我的Nokogiri任务中,我指的是包含锚点的页面的本地副本。实时页面需要登录,所以当我浏览它时,我可以看到一个标签。将登录添加到rake任务解决了它。