Ric*_*ton 52 html java parsing web-scraping
我正在开发一个从网站上删除数据的应用程序,我想知道如何获取数据.具体来说,我需要包含在许多使用特定CSS类的div标签中的数据 - 目前(用于测试目的)我只是在检查
div class = "classname"
Run Code Online (Sandbox Code Playgroud)
在HTML的每一行 - 这是有效的,但我不禁觉得那里有更好的解决方案.
有没有什么好方法我可以给一个类一行HTML并有一些很好的方法,如:
boolean usesClass(String CSSClassname);
String getText();
String getLink();
Run Code Online (Sandbox Code Playgroud)
Fer*_*lez 20
前面提到的主要问题是格式错误的HTML,因此必须使用html清理器或HTML-XML转换器.一旦获得XML代码(XHTML),就有很多工具可以处理它.您可以使用简单的SAX处理程序来获取它,该处理程序仅提取您需要的数据或任何基于树的方法(DOM,JDOM等),甚至可以修改原始代码.
下面是一个示例代码,它使用HTML清理程序来获取使用某个类的所有DIV并打印出其中的所有Text内容.
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
/**
* @author Fernando Miguélez Palomo <fernandoDOTmiguelezATgmailDOTcom>
*/
public class TestHtmlParse
{
static final String className = "tags";
static final String url = "http://www.stackoverflow.com";
TagNode rootNode;
public TestHtmlParse(URL htmlPage) throws IOException
{
HtmlCleaner cleaner = new HtmlCleaner();
rootNode = cleaner.clean(htmlPage);
}
List getDivsByClass(String CSSClassname)
{
List divList = new ArrayList();
TagNode divElements[] = rootNode.getElementsByName("div", true);
for (int i = 0; divElements != null && i < divElements.length; i++)
{
String classType = divElements[i].getAttributeByName("class");
if (classType != null && classType.equals(CSSClassname))
{
divList.add(divElements[i]);
}
}
return divList;
}
public static void main(String[] args)
{
try
{
TestHtmlParse thp = new TestHtmlParse(new URL(url));
List divs = thp.getDivsByClass(className);
System.out.println("*** Text of DIVs with class '"+className+"' at '"+url+"' ***");
for (Iterator iterator = divs.iterator(); iterator.hasNext();)
{
TagNode divElement = (TagNode) iterator.next();
System.out.println("Text child nodes of DIV: " + divElement.getText().toString());
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
use*_*586 18
几年前,我使用JTidy用于同样的目的:
"JTidy是HTML Tidy的Java端口,HTML语法检查器和漂亮的打印机.就像它的非Java表兄弟一样,JTidy可以用作清理格式错误和错误的HTML的工具.此外,JTidy提供了一个DOM接口.正在处理的文档,这有效地使您能够将JTidy用作实际HTML的DOM解析器.
JTidy是由Andy Quick编写的,后者后来退出了维护者职位.现在,JTidy由一群志愿者维护.
有关JTidy的更多信息可以在JTidy SourceForge项目页面上找到."
小智 5
HTMLParser项目(http://htmlparser.sourceforge.net/)可能是一种可能性.在处理格式错误的HTML时似乎相当不错.以下代码段应该满足您的需求:
Parser parser = new Parser(htmlInput);
CssSelectorNodeFilter cssFilter =
new CssSelectorNodeFilter("DIV.targetClassName");
NodeList nodes = parser.parse(cssFilter);
Run Code Online (Sandbox Code Playgroud)
让我们不要忘记Jerry,它的Java jQuery:一个快速简洁的Java库,它简化了HTML文档的解析,遍历和操作。包括使用css3选择器。
例:
Jerry doc = jerry(html);
doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy");
Run Code Online (Sandbox Code Playgroud)
例:
doc.form("#myform", new JerryFormHandler() {
public void onForm(Jerry form, Map<String, String[]> parameters) {
// process form and parameters
}
});
Run Code Online (Sandbox Code Playgroud)
当然,这些只是一些简单的例子,可以让您感觉到整体情况。