Как разделить строку в соответствии с именем тега на странице HTML, используя String.split () - PullRequest
0 голосов
/ 21 февраля 2011

Я хочу разделить следующую строку в соответствии с тегами td:

<html>

<body>
  <table>
    <tr><td>data1</td></tr>
    <tr><td>data2</td></tr>
    <tr><td>data3</td></tr>
    <tr><td>data4</td></tr>
  </table>
</body>

Я пробовал split("h2"); и split("[h2]");, но в этом случае метод разделения разделяетHTML-код, где он находит "h" или "2" и, если я не ошибаюсь, также "h2".

Моя конечная цель состоит в том, чтобы получить все между <td> и </td>

МожетКто-нибудь, пожалуйста, скажите, пожалуйста, как это сделать с только с использованием split()?

Большое спасибо

Ответы [ 5 ]

3 голосов
/ 21 февраля 2011

номер

Это будет означать & mdash; по сути & mdash; парсинг HTML с помощью регулярных выражений Мы не делаем этого 'вокруг этих частей.

1 голос
/ 21 февраля 2011

Вы не можете успешно проанализировать HTML (или, в вашем случае, получить данные между тегами TD) с регулярными выражениями. Вы должны взглянуть на простой HTML-парсер:

import java.io.StringReader;

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML.Tag;
import javax.swing.text.html.HTMLEditorKit.ParserCallback;
import javax.swing.text.html.parser.ParserDelegator;

public static List<String> extractTDs(String html) throws IOException {
    final List<String> tdList = new ArrayList<String>();

    ParserDelegator parserDelegator = new ParserDelegator();
    ParserCallback parserCallback = new ParserCallback() {
        StringBuffer buffer = new StringBuffer();
        public void handleText(final char[] data, final int pos) {
            buffer.append(data);
        }
        public void handleEndTag(Tag t, final int pos) {  
            if(Tag.TD.equals(t)) {
                tdList.add(buffer.toString());
            }
            buffer = new StringBuffer();
        }
    };

    parserDelegator.parse(new StringReader(html), parserCallback, true);

    return tdList;
}
1 голос
/ 21 февраля 2011

Вот как решить вашу оптимальную цель:

String html = ""; // your html
Pattern p = Pattern.compile("<td>([^<]*)</td>", Pattern.MULTILINE | Pattern.DOTALL);

for (Matcher m = p.matcher(html);  m.find(); ) {
    String tag = m.group(1);
    System.out.println(tyg);
}

Обратите внимание, что этот код написан здесь без компилятора, но он дает идею.

НО, почему вы хотите анализировать HTML с помощью регулярных выражений? Я согласен с парнями: используйте парсер HTML или XML (если ваш HTML хорошо отформатирован.)

0 голосов
/ 21 февраля 2011

String.Split или regexes не должны использоваться для разбора языков разметки, так как они не имеют понятия глубины (HTML является рекурсивной грамматикой, для которой требуется рекурсивный синтаксический анализатор). Подумайте, что произойдет, если ваш <td> будет выглядеть так:

<td>
  <table><tr><td> td inside a td? </td></tr></table>
</td>

Регулярное выражение с жадностью сопоставляет все, что находится между внешними <td>...</td>, давая вам нежелательные результаты.

Вы должны использовать HTML-парсер, как упоминал Йохан.

0 голосов
/ 21 февраля 2011

Вы должны действительно использовать html-парсер, такой как neko html или HtmlParser .

Если у вас очень маленький набор контролируемых html, вы могли бы (хотя я вообще рекомендую против этого) использовать регулярное выражение, такое как

(?<=\\<td\\>)\\w+(?=\\</td\\>)
...