繁体   English   中英

使用JSoup帮助抓取HTML

[英]Help scraping HTML with JSoup

这里有一点初学者,正在开展一个个人项目,将我的学校课程设置变成一个易于阅读的表格格式,但是在从网站上抓取数据的最初步骤时遇到了麻烦。

我刚刚在eclipse中将JSoup库添加到了我的项目中,在使用Jsoup的文档时,我现在无法初始化连接。

最后,我的目标是获取每个班级名称/时间/描述,但是现在我想抓住这个名字。 源网站的HTML显示如下:

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

我的第一个猜测是getElementsByTag(td),然后查询这些元素的onclick =参数或'class'参数的值,通过删除最初的“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");

在这一点上,我已经遇到了问题(尽管我并没有偏离文档中提供的示例),并希望得到一些关于让我的代码运行的指导!

编辑:GOT IT! 谢谢你们!

根据你应该做的文件

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

parse()方法适用于文件。

我刚刚下载了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

太酷了! 弗拉德是对的; 使用connect(...)方法。 弗拉德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个变量
  • 像Vlad建议的那样获取我的文档。
  • 创建一个td Elements变量并为其分配具有td标记的所有元素。
  • 使用for循环,使用int从0到<td.size()并使用td.get(i);获取每个Element元素td.get(i);
  • 在循环内部检查元素的class属性。
  • 如果属性String等于CLASS_ATTRIB_UNIT_NAME字符串(参见上文),请获取元素的文本并使用它来设置unitName变量。
  • 如果属性String等于CLASS_ATTRIB_COURSE_NUM,则将courseNumbName设置为元素的文本。
  • 如果属性String等于CLASS_ATTRIB_COURSE_NAME将元素的文本追加到courseNumbName字符串,则将String添加到数组列表,并将courseNumbName =设置为“”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM