Помогите очистить HTML с помощью JSoup

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

Я только что добавил библиотеку JSoup в свой проект в eclipse, и теперь у меня возникают проблемы с инициализацией соединения при использовании документации для Jsoup.

В конце концов, моя цель — захватить имя/время/описание каждого класса, но сейчас я хочу просто захватить имя. HTML-код исходного веб-сайта выглядит следующим образом:

<td class='CourseNum'><img src='images/minus.gif' class='ICS3330 SW' onclick="toggledetails('CS3330')

Моя первая догадка заключалась в том, чтобы получитьElementsByTag(td), а затем запросить эти элементы для параметра onclick= или значения параметра «класс», очистив его, удалив начальное «I» и суффикс «SW», оставив позади имя «CS3330».

Теперь о фактической реализации:

Document doc = Jsoup.parse("UTF-8", "http://rabi.phys.virginia.edu/mySIS/CS2/page.php?Semester=1118&Type=Group&Group=CompSci").get();
Elements td = doc.getElementsByTag("td");

На данный момент я уже сталкиваюсь с проблемами (хотя я не сильно отклоняюсь от примеров, представленных в документации), и был бы признателен за некоторые рекомендации по тому, как заставить мой код работать!

редактировать: ПОНЯЛ! Спасибо вам всем!


person asolanki    schedule 07.08.2011    source источник
comment
Какие проблемы? Если ошибки, пожалуйста, опубликуйте фактическое сообщение об ошибке в исходном сообщении выше.   -  person Hovercraft Full Of Eels    schedule 07.08.2011
comment
Только что скачал библиотеку JSoup и опробовал ее на своем веб-сайте. Работает как часы! Очень круто! 1+   -  person Hovercraft Full Of Eels    schedule 07.08.2011


Ответы (2)


Я только что скачал JSoup и попробовал его на веб-сайте вашей школы и получил следующий результат:

Unit: Computer Science
   CS 1010: Introduction to Information Technology
   CS 1110: Introduction to Programming
   CS 1111: Introduction to Programming
   CS 1112: Introduction to Programming
   CS 1120: From Ada and Euclid to Quantum Computing and the World Wide Web
   CS 2102: Discrete Mathematics I
   CS 2110: Software Development Methods
   CS 2150: Program and Data Representation
   CS 2220: Engineering Software
   CS 2330: Digital Logic Design
   CS 2501: Special Topics in Computer Science
   CS 3102: Theory of Computation
   CS 3330: Computer Architecture
   CS 4102: Algorithms
   CS 4240: Principles of Software Design
   CS 4414: Operating Systems
   CS 4444: Introduction to Parallel Computing
   CS 4457: Computer Networks
   CS 4501: Special Topics in Computer Science
   CS 4753: Electronic Commerce Technologies
   CS 4810: Introduction to Computer Graphics
   CS 4993: Independent Study
   CS 4998: Distinguished BA Majors Research
   CS 6161: Design and Analysis of Algorithms
   CS 6190: Computer Science Perspectives
   CS 6354: Computer Architecture
   CS 6444: Introduction to Parallel Computing
   CS 6501: Special Topics in Computer Science
   CS 6610: Programming Languages
   CS 7457: Computer Networks
   CS 7993: Independent Study
   CS 7995: Supervised Project Research
   CS 8501: Special Topics in Computer Science
   CS 8524: Topics in Software Engineering
   CS 8897: Graduate Teaching Instruction
   CS 8999: Thesis
   CS 9999: Dissertation

Слишком круто! Однако Влад прав; используйте метод подключения (...). 1+ Владу

Другие предложения и подсказки:
Вот константы, которые я использовал в своей маленькой программе:

   private static final String URL = "http://rabi.phys.virginia.edu/mySIS/CS2/" +
        "page.php?Semester=1118&Type=Group&Group=CompSci";
   private static final String TD_TAG = "td";
   private static final String CLASS_ATTRIB = "class";
   private static final String CLASS_ATTRIB_UNIT_NAME = "UnitName";
   private static final String CLASS_ATTRIB_COURSE_NUM = "CourseNum";
   private static final String CLASS_ATTRIB_COURSE_NAME = "CourseName";

И это переменные, которые я использовал внутри метода очистки:

     String unitName = "";
     List<String> courseNumbNameList = new ArrayList<String>();
     String courseNumbName = "";

Редактировать 1
Основываясь на ваших последних комментариях, я думаю, что вы слишком много думаете. Что хорошо сработало для меня, так это простой алгоритм:

  • Создайте 3 переменные, которые я перечислил выше
  • Получите мой документ, как рекомендует Влад.
  • Создайте переменную td Elements и назначьте ей все элементы, имеющие тег td.
  • Используйте цикл for с int i, идущим от 0 до ‹ td.size(), и получайте каждый элемент, элемент, используя td.get(i);
  • Внутри цикла проверьте атрибут класса элемента.
  • Если строка атрибута равна строке CLASS_ATTRIB_UNIT_NAME (см. выше), получите текст элемента и используйте его для установки переменной unitName.
  • Если строка атрибута равна CLASS_ATTRIB_COURSE_NUM, задайте для курсаNumbName текст элемента.
  • Если строка атрибута равна CLASS_ATTRIB_COURSE_NAME, добавьте текст элемента к строке courseNumbName, добавьте строку в список массивов и установите для courseNumbName = значение "".
person Hovercraft Full Of Eels    schedule 07.08.2011
comment
Это очень похоже на то, что я хочу! Вот где я сейчас: Document doc = Jsoup.connect(URL).get(); Таблицы элементов = doc.getElementsByTag(TD_TAG); Теперь предположим, что речь идет о HTML: ‹td class='CourseName' colspan='7' onmouseover=return OLgetAJAX('classtip.php?Mnemonic=CSNumber=1010', OLcmdCT, 300, 'ovfl1'); onmouseout=OLclearAJAX();nd();›Introduction to Information Technology‹/td› Любые указатели на A) нацеливание на этот элемент таблицы и B) очистку innerHTML, чтобы сделать его читаемым CSXXXX? - person asolanki; 08.08.2011
comment
@asolaki: опубликуйте этот код как редактирование исходного вопроса, а не в комментарии, так как он не будет правильно форматироваться в комментариях. - person Hovercraft Full Of Eels; 08.08.2011
comment
@asolaki: см. Редактировать 1 в моем ответе выше. - person Hovercraft Full Of Eels; 08.08.2011
comment
большое спасибо за ваше терпение, кажется, я почти закончил с поставленной задачей. Я повторно отредактировал ОП для того, что, я надеюсь, станет моим последним вопросом. - person asolanki; 08.08.2011
comment
@asloanki: поздравляю с продвижением вперед. Опять же, не забудьте проголосовать за Влада за его вклад. - person Hovercraft Full Of Eels; 08.08.2011
comment
Я обязательно проголосую и за вас, и за Влада, как только у меня будет достаточно репутации для этого :). Вы случайно не знаете, как удалить тег ‹img› из моего вывода, не так ли? - person asolanki; 08.08.2011
comment
Вам не нужно беспокоиться о теге img, если вы будете следовать моим рекомендациям выше. Он извлекает только текст с помощью метода getText(). - person Hovercraft Full Of Eels; 08.08.2011

Согласно документации, вы должны делать:

Document doc = Jsoup.connect(url).get();

Метод parse() предназначен для файлов.

person Vlad    schedule 07.08.2011
comment
Несоответствие типов: невозможно преобразовать из org.jsoup.nodes.Document в javax.swing.text.Document - person asolanki; 08.08.2011
comment
@asolanki: это ошибка в вашем коде: вы пытаетесь использовать javax.swing.Document, а не org.jsoup.nodes.Document. Другими словами, используйте не Swing Document, а класс Document, поставляемый с JSoup. И снова Влад прав, и я рекомендую вам тоже проголосовать за него. - person Hovercraft Full Of Eels; 08.08.2011
comment
Исправлено - похоже, я допустил ошибку в пакете документов, который я импортировал. Проклятая IDE делает вещи проще, но запутывает мое понимание! - person asolanki; 08.08.2011
comment
Точно. Это действительно так просто, тогда просто используйте firebug, чтобы увидеть, какие идентификаторы и классы читать или манипулировать. - person nckbrz; 28.05.2014