Как использовать ruby, чтобы получить строку между тегами HTML <cite>? - PullRequest
1 голос
/ 18 сентября 2009

Приветствую всех:

Я хотел бы получить информацию из огромной коллекции страниц результатов поиска Google. Единственное, что мне нужно, это URL-адреса внутри набора <cite></cite> HTML-тегов.

Я не могу найти какое-либо иное решение для решения этой проблемы, поэтому теперь я перехожу на ruby.

Это то, что я написал:

require 'net/http'
require 'uri'

url=URI.parse('http://www.google.com.au')
res= Net::HTTP.start(url.host, url.port){|http|
    http.get('/#hl=en&q=helloworld')}
puts res.body

К сожалению, я не могу использовать рекомендуемый гем hpricot ruby ​​(потому что он пропускает команду make или что-то в этом роде?)

Так что я бы хотел придерживаться этого подхода.

Теперь, когда я могу получить тело ответа в виде строки, единственное, что мне нужно, - это извлечь все, что находится внутри города (удалить i, чтобы увидеть настоящее имя :)) HTML-теги.

Как мне это сделать? используя регулярное выражение? Кто-нибудь может привести пример?

Ответы [ 4 ]

3 голосов
/ 18 сентября 2009

Вот один из способов сделать это с помощью Nokogiri:

Nokogiri::HTML(res.body).css("cite").map {|cite| cite.content}
2 голосов
/ 18 сентября 2009

Если у вас проблемы с hpricot, вы также можете попробовать nokogiri , который очень похож и позволяет вам делать то же самое.

2 голосов
/ 18 сентября 2009

Я думаю, что это решит это:

res.scan(/<cite>([^<>]*)<\/cite>/imu).flatten

# This one to ignore empty tags:

res.scan(/<cite>([^<>]*)<\/cite>/imu).flatten.select{|x| !x.empty?}
1 голос
/ 18 сентября 2009

Разбейте строку на нужный тег. Если предположить только один экземпляр тега (или указать только одно разбиение), у вас будет две части, которые я назову head и tail. Возьмите хвост и разделите его на закрывающий тег (один раз), так что теперь у вас будет две части в вашем новом массиве. Новый заголовок - это то, что было между вашими тегами, а новый хвост - остаток строки, который вы можете обработать снова, если тег может появиться более одного раза.

Пример, который может быть не совсем правильным, но вы поняли:

head1, tail1 = str.split('<tag>', 1) # finds the opening tag
head2, tail2 = tail1.split('</tag>', 1) # finds the closing tag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...