我想解析一个包含从Delicious导出的链接的html文件。我正在使用Nokogiri进行解析。该文件具有以下结构:
<DT>
<A HREF="http://mezzoblue.com/archives/2009/01/27/sprite_optim/"
ADD_DATE="1233132422"
PRIVATE="0"
TAGS="irw_20">mezzoblue § Sprite Optimization</A>
<DT>
<A HREF="http://datamining.typepad.com/data_mining/2008/11/minority-report-interface.html"
ADD_DATE="1226827542"
PRIVATE="0"
TAGS="irw_20">Minority Report Interface</A>
<DT>
<A HREF="http://www.windowshop.com/"
ADD_DATE="1225267658"
PRIVATE="0"
TAGS="irw_20">Amazon Windowshop Beta</A>
<DD>Window shopping from Amazon
正如您所看到的,链接信息位于DT-tag中,而某些链接在DD-tag中有注释。
我执行以下操作以获取链接信息:
doc.xpath('//dt//a').each do |node|
title = node.text
url = node['href']
tags = node['tags']
puts "#{title}, #{url}, #{tags}"
end
我的问题是如何在dd标签出现时获取链接信息和评论?
答案 0 :(得分:3)
我的问题是我如何获得链接 信息和评论时的dd 标签是否存在?
使用强>:
//DT/a | //DT[a]/following-sibling::*[1][self::DD]
这将选择所有a
元素,这些元素具有DT
父元素和所有DD
元素,这些元素是DT
元素的后续兄弟元素,其{{1}元素孩子。
注意:强烈建议不要使用a
,因为它通常会导致开发人员使用效率低下和异常。
每当知道XML文档的结构时,请避免使用//
缩写。
答案 1 :(得分:2)
你的问题并不清楚你在寻找什么。
首先,HTML格式不正确,因为<DT>
标记未正确关闭,并且Ruby 1.9.2不喜欢的第一个a
标记文本中存在非法字符,因为它不是UTF-8。我将角色转换为TextMate中的实体。
html = %{
<DT>
<A HREF="http://mezzoblue.com/archives/2009/01/27/sprite_optim/" ADD_DATE="1233132422" PRIVATE="0" TAGS="irw_20">mezzoblue § Sprite Optimization</A>
<DT>
<A HREF="http://datamining.typepad.com/data_mining/2008/11/minority-report-interface.html" ADD_DATE="1226827542" PRIVATE="0" TAGS="irw_20">Minority Report Interface</A>
<DT>
<A HREF="http://www.windowshop.com/" ADD_DATE="1225267658" PRIVATE="0" TAGS="irw_20">Amazon Windowshop Beta</A>
<DD>Window shopping from Amazon
}
在Nokogiri尝试解决之后,HTML会解析这个问题:
(rdb:1) print doc.to_html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<dt>
<a href="http://mezzoblue.com/archives/2009/01/27/sprite_optim/" add_date="1233132422" private="0" tags="irw_20">mezzoblue § Sprite Optimization</a>
<dt>
<a href="http://datamining.typepad.com/data_mining/2008/11/minority-report-interface.html" add_date="1226827542" private="0" tags="irw_20">Minority Report Interface</a>
<dt>
<a href="http://www.windowshop.com/" add_date="1225267658" private="0" tags="irw_20">Amazon Windowshop Beta</a>
</dt>
</dt>
</dt>
<dd>Window shopping from Amazon
</dd>
</body></html>
请注意结束dt
标记是如何在唯一dd
标记之前分组的?这很蹩脚,但没关系,因为它不会改变我们查找dd
内容的方式。
doc = Nokogiri::HTML(html, nil, 'UTF-8')
comments = []
doc.css('dt + dd').each do |a|
comments << a.text
end
puts comments
# >> Window shopping from Amazon
这意味着,找到<dt>
后跟<dd>
。您没有/不能查找dt
后跟a
后跟dd
,因为这不是HTML解析的方式。它实际上是dt
后跟dd
,这就是“dt + dd
”的含义。
您的问题似乎可以解读的另一种方式是您正在寻找a
标签的内容:
comments = []
doc.css('a').each do |a|
comments << a.text
end
puts comments
# >> mezzoblue § Sprite Optimization
# >> Minority Report Interface
# >> Amazon Windowshop Beta
答案 2 :(得分:0)
我假设:
<DD>Window shopping from Amazon
有一个结尾/ DD标记,我无法从你的页面片段中分辨出来。如果是这样,你可以这样做:
comment = node.parent.next_sibling.next_sibling.text rescue nil
您需要调用next_sibling两次,因为第一个将匹配\ n(新行)或空格。您可以在解析页面之前删除所有新行以避免双重调用。如果在DT标签之后有超过1个新行字符,那么这也许是一个好主意