Мне нужно извлечь некоторую часть данных из кода HTML. Вот :

<span
class="Z3988" style="display:none;"
title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;
rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.genre=article&amp;
rft.atitle=Parliamentarism Rationalized&amp;
rft.title=East European Constitutional Review&amp;
rft.stitle=E. Eur. Const. Rev.&amp;rft.date=1993&amp;
rft.volume=2&amp;rft.spage=33&amp;rft.au=Tanchev, Evgeni&amp;
rft_id=http://heinonline.org/HOL/Page?handle%3Dhein.journals/eeurcr2%26id%3D33%26div%3D%26collection%3D">
</span>

Я пытался использовать, например:

document.querySelector("span.Z3988").textContent

document.getElementsbyClassName("Z3988")[0].textContent

Моя конечная цель - получить то, что приходит после:

  1. rft.atitle (Parliamentarism Rationalized)
  2. rft.title (East European Constitutional Review)
  3. rft.date
  4. rft.volume
  5. rft.spage
  6. rft.au

Как мне это сделать? Я хотел бы избежать RegEx.

0
menteith 8 Дек 2016 в 02:01

5 ответов

Лучший ответ

Если вы пытаетесь получить атрибут title:

document.getElementsByClassName("Z3988")[0].getAttribute("title");
0
roger 7 Дек 2016 в 23:08

То, что у вас есть в заголовке, похоже на поисковый запрос URL ...

var elm = document.querySelector('.Z3988')
var params = new URLSearchParams(elm.title) // parse everything

console.log(...params) // list all
console.log(params.get('rft.title')) // getting one example
<span class="Z3988" style="display:none;" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.genre=article&amp;rft.atitle=Parliamentarism Rationalized&amp;rft.title=East European Constitutional Review&amp;rft.stitle=E. Eur. Const. Rev.&amp;rft.date=1993&amp;rft.volume=2&amp;rft.spage=33&amp;rft.au=Tanchev, Evgeni&amp;rft_id=http://heinonline.org/HOL/Page?handle%3Dhein.journals/eeurcr2%26id%3D33%26div%3D%26collection%3D"></span>
1
Endless 7 Дек 2016 в 23:38

Не уверен, как это будет происходить с совместимостью с браузером или версиями JavaScript, но вы определенно можете отключить функции стрелок для ванильных анонимных функций и «let» для «var». В противном случае он соответствует параметрам без регулярных выражений и даже создает хороший способ индексации ваших различных ключевых слов.

Мои шаги:

  • Возьмите блок атрибутов
  • Разделите его на элементы массива, содержащие нужные ключевые слова и содержимое
  • Разделите нужные ключевые слова и содержание на под-массивы
  • Обрезать содержимое каждого блока ключевых слов для символов и не алфавитно-цифровых
  • Построить объекты для удобной индексации

Очевидно, что последняя часть - это просто распечатать массив объектов в удобном для чтения формате. Надеюсь, что это помогает вам!

window.onload = function() {
  let x = document.getElementsByClassName('Z3988')[0].getAttribute('title')
  let a = x.split('rft.').map((y) => y.split('='))
  a = a.map((x, i) => { 
    x = x.map((y) => {
      let idx = y.indexOf('&')
      return y = (idx > -1) ? y.slice(0, idx) : y
    })    
    let x1 = x[0], x2 = x[1], obj = {}
    obj[x1] = x2
    return a[i] = obj
  })
  a.forEach((x) => {
    let div = document.createElement('div')
    let br = document.createElement('br')
    let text = document.createTextNode(JSON.stringify(x))
    div.appendChild(text)
    div.appendChild(br)
    document.body.appendChild(div)
  })
}
<span
class="Z3988" style="display:none;"
title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;
rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.genre=article&amp;
rft.atitle=Parliamentarism Rationalized&amp;
rft.title=East European Constitutional Review&amp;
rft.stitle=E. Eur. Const. Rev.&amp;rft.date=1993&amp;
rft.volume=2&amp;rft.spage=33&amp;rft.au=Tanchev, Evgeni&amp;
rft_id=http://heinonline.org/HOL/Page?handle%3Dhein.journals/eeurcr2%26id%3D33%26div%3D%26collection%3D">
</span>
0
marotafuka 8 Дек 2016 в 01:11

Получить текст заголовка span,

Плевать на =, присоединиться, используя символ, который не появится в подготовленной мной строке ^, сделать то же самое для ;, и разбить на уникальный символ, используемый ^ в этом случае а затем выбрать значение для каждого четного индекса. Если вам нужна строка, просто присоединитесь к ней.

Пример фрагмента:

var spanTitle = document.getElementsByClassName("Z3988")["0"].getAttribute("title");

var data = spanTitle.split("=").join("^").split(";").join("^").split("^")

var finaldata = data.filter(function(d, index) {
  return !!index % 2;
})

console.log(finaldata)
<span class="Z3988" style="display:none;" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;
rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.genre=article&amp;
rft.atitle=Parliamentarism Rationalized&amp;
rft.title=East European Constitutional Review&amp;
rft.stitle=E. Eur. Const. Rev.&amp;rft.date=1993&amp;
rft.volume=2&amp;rft.spage=33&amp;rft.au=Tanchev, Evgeni&amp;
rft_id=http://heinonline.org/HOL/Page?handle%3Dhein.journals/eeurcr2%26id%3D33%26div%3D%26collection%3D">
</span>
1
A.J 7 Дек 2016 в 23:12

То, как вы выводите контент в виде текста, действительно плохой метод. Вы можете попробовать напечатать каждый раздел вашего текста в атрибуты элемента и получить каждую часть с помощью element.getAttribute ().

Пример:

<span id='whatever' stitle='content' spage='content'></span>

И извлечь из выбранного элемента.

Если у вас есть способ, вы можете попробовать поместить этот текст в переменную и разделить значения следующим образом:

var element_text = document.getElementsbyClassName("Z3988")[0].textContent;
var element_specifics = element_text.split(';'); // Separate the text into array splitting by the ';'
0
James 7 Дек 2016 в 23:16