首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Nokogiri解析具有从Delicious.com导出的链接的文件的最佳方法?

使用Nokogiri解析具有从Delicious.com导出的链接的文件的最佳方法?
EN

Stack Overflow用户
提问于 2010-12-18 08:48:22
回答 3查看 459关注 0票数 2

我想解析一个html文件,其中包含从from导出的链接。我正在使用Nokogiri进行解析。该文件具有以下结构:

代码语言:javascript
复制
<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-标记中,有些链接在DD-标记中有注释。

我执行以下操作以获取链接信息:

代码语言:javascript
复制
doc.xpath('//dt//a').each do |node|
  title = node.text
  url = node['href']
  tags = node['tags']
  puts "#{title}, #{url}, #{tags}"
end

我的问题是,当dd标记存在时,如何获得链接信息和注释?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-18 17:53:26

我的问题是,当dd标记存在时,如何获得链接信息和注释?

使用

代码语言:javascript
复制
//DT/a | //DT[a]/following-sibling::*[1][self::DD]

这将选择具有a父元素的所有DT元素和具有a子元素的DT元素的紧跟同级元素的所有DD元素。

Note:强烈反对使用//,因为它通常会导致开发人员在使用//时效率低下和异常。

每当XML文档的结构已知时,请避免使用XML // abbreviation.。

票数 3
EN

Stack Overflow用户

发布于 2010-12-18 09:26:17

你的问题不清楚你在找什么。

首先,HTML格式错误,因为<DT>标记没有正确关闭,第一个a标记的文本中有一个非法字符,而Ruby1.9.2不喜欢它,因为它不是UTF-8。我将字符转换为TextMate中的一个实体。

代码语言:javascript
复制
html = %{
<DT>
  <A HREF="http://mezzoblue.com/archives/2009/01/27/sprite_optim/" ADD_DATE="1233132422" PRIVATE="0" TAGS="irw_20">mezzoblue &sect; 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就会解析它:

代码语言:javascript
复制
(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内容的方式。

代码语言:javascript
复制
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标记的内容:

代码语言:javascript
复制
comments = []
doc.css('a').each do |a|
  comments << a.text
end
puts comments

# >> mezzoblue § Sprite Optimization
# >> Minority Report Interface
# >> Amazon Windowshop Beta
票数 2
EN

Stack Overflow用户

发布于 2010-12-18 09:41:36

我假设:

代码语言:javascript
复制
<DD>Window shopping from Amazon

有一个结尾的/DD标记,我无法从页面的片段中分辨出来。如果是这样,你可以:

代码语言:javascript
复制
comment = node.parent.next_sibling.next_sibling.text rescue nil

您需要调用两次next_sibling,因为第一个将匹配\n (新行)或空白。您可以在解析页面之前删除所有新行,以避免双重调用。如果DT标签后面有超过一个新的行字符,那也是个好主意

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4477369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档