Лучший способ проанализировать файл со ссылками, экспортированными из Delicious.com с помощью Nokogiri? - PullRequest
2 голосов
/ 18 декабря 2010

Я хочу проанализировать HTML-файл, содержащий ссылки, экспортированные из Delicious.Я использую 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-теге, а некоторые ссылки содержат комментарий в DD-теге.

Я делаюДалее, чтобы получить информацию о ссылке:

doc.xpath('//dt//a').each do |node|
  title = node.text
  url = node['href']
  tags = node['tags']
  puts "#{title}, #{url}, #{tags}"
end

Мой вопрос: как мне получить информацию о ссылке И комментарий, когда присутствует тег dd?

Ответы [ 3 ]

3 голосов
/ 18 декабря 2010

Мой вопрос: как мне получить информацию о ссылке И комментарий, когда присутствует тег dd?

Использовать :

//DT/a | //DT[a]/following-sibling::*[1][self::DD]

При этом выбираются все элементы a, у которых есть родительский элемент DT, и все элементы DD, являющиеся непосредственно следующим элементом родственного элемента DT, который имеет дочерний элемент a.1017 * Примечание : Использование // настоятельно не рекомендуется, поскольку оно обычно приводит к неэффективности и аномалиям в его использовании для разработчиков.

Если структура XML-документа известна, не используйте сокращение // .

.
2 голосов
/ 18 декабря 2010

Ваш вопрос не ясен о том, что вы ищете.

Во-первых, HTML-код искажен, потому что теги <DT> закрыты неправильно, и в тексте первого тега a есть недопустимый символ, который не нравится Ruby 1.9.2, потому что это не 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 &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
}

Этот HTML анализирует это в Nokogiri после того, как пытается это исправить:

(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
0 голосов
/ 18 декабря 2010

Я предполагаю:

<DD>Window shopping from Amazon

имеет метку окончания / DD, я не могу судить только по твоему фрагменту страницы. Если это так, вы можете сделать:

comment = node.parent.next_sibling.next_sibling.text rescue nil

Вам нужно вызвать next_sibling дважды, поскольку первый из них будет соответствовать \ n (новая строка) или пробелу. Вы можете удалить все новые строки перед анализом страницы, чтобы избежать двойного вызова. Это также может быть хорошей идеей, если после тэга DT более 1 символа новой строки

...