получать разделенный BR текст через DOM в JS / JQuery? - PullRequest
3 голосов
/ 25 мая 2010

Я пишу скрипт greasemonkey, который анализирует страницу со следующей общей структурой:

<table>
<tr><td><center>
<b><a href="show.php?who=IDNumber">(Account Name)</a></b>
 (#IDNumber)
<br> (Rank)
<br> (Title)
<p>
<b>Statistics:</b>
<br>
<table>
<tr><td>blah blah etc.
</td></tr></table></center></table>

Я специально пытаюсь извлечь часть (название) из этого. Однако, как вы можете видеть, он выделяется только тегом <BR>, не имеет собственного идентификатора, является лишь частью текста тега <CENTER>, и этот тег имеет целый ряд другого текста, связанного это.

Сейчас я пытаюсь получить innerHTML тега Center и использовать регулярное выражение для соответствия /<br>([A-Za-z ]*)<p><b>Statistics/. Это работает хорошо для меня, но кажется, что должен быть лучший способ выбрать этот конкретный текст.

... Итак, есть ли лучший способ? Или я должен жаловаться программисту сайта, что он должен сделать этот текст более доступным? : -)

Ответы [ 2 ]

3 голосов
/ 26 мая 2010

РЕДАКТИРОВАТЬ: обновлено, чтобы удалить пробелы

var title = $('table center').contents().filter(function() {
         if( this.nodeType == 3 && $.trim(this.data) != "") { //get only text nodes and filter out whitespace elements
           return true;
        }
      }).get(2); // get the 3rd text node 


    alert( title.data ); // alerts "(Title)
    title.data = "How to use jQuery"; // (Title) changes

Как это работает:

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

Вы всегда можете:

  $('table center').contents().filter(function() {
       if( this.nodeType == 3 && $.trim(this.data) != "") { //get only text nodes and filter out whitespace elements
           return true;
        }
      }).wrap('<p></p>') // make those text nodes paragraphs
      .end().filter('br')
        .remove(); // remove the brs

см. Документацию jquery для .contents ()

1 голос
/ 26 мая 2010

Это похоже на работу:

var result = $('table td:first-child > center > br:eq(1)').get(0)

alert(result.nextSibling.nodeValue);
...