Получение значения атрибута в Nokogiri для извлечения URL ссылок

for i in $(seq 1 $END); do echo $i; done

edit: Я предпочитаю seq по сравнению с другими методами, потому что я действительно могу его запомнить;)

29
задан fearless_fool 29 November 2013 в 11:44
поделиться

6 ответов

html = <<HTML
  <div id="block">
    <a href="http://google.com">link</a>
  </div>
HTML
doc = Nokogiri::HTML(html)
doc.xpath('//div/a/@href')
#=> [#<Nokogiri::XML::Attr:0x80887798 name="href" value="http://google.com">]

Или, если вы хотите быть более конкретным в отношении div:

>> doc.xpath('//div[@id="block"]/a/@href')
=> [#<Nokogiri::XML::Attr:0x80887798 name="href" value="http://google.com">]
>> doc.xpath('//div[@id="block"]/a/@href').first.value
=> "http://google.com"
46
ответ дан Michael Kohl 29 November 2013 в 11:44
поделиться
document.css("#block a")["href"]

, где document - HTML-код Nokogiri.

0
ответ дан Oscar Albert 29 November 2013 в 11:44
поделиться
data = '<html lang="en" class="">
    <head>
    <a href="https://example.com/9f40a.css" media="all" rel="stylesheet" /> link1</a>
    <a href="https://example.com/4e5fb.css" media="all" rel="stylesheet" />link2</a>
    <a href="https://example.com/5s5fb.css" media="all" rel="stylesheet" />link3</a>
   </head>
  </html>'

Вот мой пример кода HTML выше:

doc = Nokogiri::HTML(data)
doc.xpath('//@href').map(&:value)
=> [https://example.com/9f40a.css, https://example.com/4e5fb.css, https://example.com/5s5fb.css]
1
ответ дан Gagan Gami 29 November 2013 в 11:44
поделиться
doc = Nokogiri::HTML("HTML ...")
href = doc.css("div[id='block'] > a")
result = href['href'] #http://google.com
4
ответ дан bor1s 29 November 2013 в 11:44
поделиться
1125 Борясь с этим вопросом в разных формах, я решил написать себе учебник, замаскированный под ответ. Это может быть полезно для других.

Начиная с этого фрагмента:

require 'rubygems'
require 'nokogiri'

html = <<HTML
<div id="block1">
    <a href="http://google.com">link1</a>
</div>
<div id="block2">
    <a href="http://stackoverflow.com">link2</a>
    <a id="tips">just a bookmark</a>
</div>
HTML

doc = Nokogiri::HTML(html)

извлечение всех ссылок

Мы можем использовать xpath или css, чтобы найти все элементы, а затем оставить только те, которые имеют href attribute:

nodeset = doc.xpath('//a')      # Get all anchors via xpath
nodeset.map {|element| element["href"]}.compact  # => ["http://google.com", "http://stackoverflow.com"]

nodeset = doc.css('a')          # Get all anchors via css
nodeset.map {|element| element["href"]}.compact  # => ["http://google.com", "http://stackoverflow.com"]

Но есть и лучший способ: в приведенных выше случаях .compact необходим, потому что поиск также возвращает элемент «просто закладка». Мы можем использовать более точный поиск, чтобы найти только элементы, которые содержат атрибут href:

attrs = doc.xpath('//a/@href')  # Get anchors w href attribute via xpath
attrs.map {|attr| attr.value}   # => ["http://google.com", "http://stackoverflow.com"]

nodeset = doc.css('a[href]')    # Get anchors w href attribute via css
nodeset.map {|element| element["href"]}  # => ["http://google.com", "http://stackoverflow.com"]

для поиска конкретной ссылки

Чтобы найти ссылку в <div id="block2">

nodeset = doc.xpath('//div[@id="block2"]/a/@href')
nodeset.first.value # => "http://stackoverflow.com"

nodeset = doc.css('div#block2 a[href]')
nodeset.first['href'] # => "http://stackoverflow.com"

Если вы знаете, что ищете только одну ссылку, вы можете использовать вместо этого at_xpath или at_css:

attr = doc.at_xpath('//div[@id="block2"]/a/@href')
attr.value          # => "http://stackoverflow.com"

element = doc.at_css('div#block2 a[href]')
element['href']        # => "http://stackoverflow.com"

найти ссылку из связанного текста

Что если вы знаете текст, связанный со ссылкой, и хотите найти ее URL? Немного xpath-fu (или css-fu) пригодится:

element = doc.at_xpath('//a[text()="link2"]')
element["href"]     # => "http://stackoverflow.com"

element = doc.at_css('a:contains("link2")')
element["href"]     # => "http://stackoverflow.com"

найти текст по ссылке

А что, если вы хотите найти текст, связанный с конкретной ссылкой? Не проблема:

element = doc.at_xpath('//a[@href="http://stackoverflow.com"]')
element.text     # => "link2"

element = doc.at_css('a[href="http://stackoverflow.com"]')
element.text     # => "link2"

полезные ссылки

В дополнение к обширной документации Nokorigi , я натолкнулся на несколько полезных ссылок при написании этого:

15
ответ дан fearless_fool 29 November 2013 в 11:44
поделиться
doc = Nokogiri::HTML(open("[insert URL here]"))
href = doc.css('#block a')[0]["href"]

Переменная href присваивается значению атрибута "href" для элемента <a> внутри элемента с id 'block'. Строка doc.css('#block a') возвращает один массив элементов, содержащий атрибуты #block a. [0] предназначается для того единственного элемента, который является хешем, содержащим все имена и значения атрибута. ["href"] предназначается для ключа "href" внутри этого хеша и возвращает значение, которое является строкой, содержащей URL.

26
ответ дан seldomatt 29 November 2013 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: