Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一些帮助在Java中抓取页面_Java_Html_Xhtml_Screen Scraping - Fatal编程技术网

一些帮助在Java中抓取页面

一些帮助在Java中抓取页面,java,html,xhtml,screen-scraping,Java,Html,Xhtml,Screen Scraping,我需要使用Java刮取一个网页,我已经读到regex是一种非常低效的方式,应该将其放入DOM文档中进行导航 我试着阅读文档,但它似乎太广泛了,我不知道从哪里开始 您能告诉我如何将表刮入数组吗?我可以试着从那里找到我的路。一个片段/示例也可以 谢谢。正则表达式绝对是最好的选择。构建DOM过于复杂,本身需要大量的文本解析 将您试图废弃的网页转换为XHTML文档。有几个选项可以用Java实现这一点,例如和。这些工具还将自动修复格式错误的HTML(例如,关闭未关闭的标记)。两者都工作得很好,但我更喜欢J

我需要使用Java刮取一个网页,我已经读到regex是一种非常低效的方式,应该将其放入DOM文档中进行导航

我试着阅读文档,但它似乎太广泛了,我不知道从哪里开始

您能告诉我如何将表刮入数组吗?我可以试着从那里找到我的路。一个片段/示例也可以


谢谢。

正则表达式绝对是最好的选择。构建DOM过于复杂,本身需要大量的文本解析

  • 将您试图废弃的网页转换为XHTML文档。有几个选项可以用Java实现这一点,例如。这些工具还将自动修复格式错误的HTML(例如,关闭未关闭的标记)。两者都工作得很好,但我更喜欢JTidy,因为它与Java的domapi集成得更好
  • 使用表达式提取所需信息
  • 下面是一个使用JTidy和您提供的网页的工作示例,用于从表中提取所有文件名

    public static void main(String[] args) throws Exception {
        // Create a new JTidy instance and set options
        Tidy tidy = new Tidy();
        tidy.setXHTML(true); 
    
        // Parse an HTML page into a DOM document
        URL url = new URL("http://www.cs.grinnell.edu/~walker/fluency-book/labs/sample-table.html");        
        Document doc = tidy.parseDOM(url.openStream(), System.out);
    
        // Use XPath to obtain whatever you want from the (X)HTML
        XPath xpath = XPathFactory.newInstance().newXPath();
        XPathExpression expr = xpath.compile("//td[@valign = 'top']/a/text()");
        NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
        List<String> filenames = new ArrayList<String>();
        for (int i = 0; i < nodes.getLength(); i++) {
            filenames.add(nodes.item(i).getNodeValue()); 
        }
    
        System.out.println(filenames);
    }
    
    publicstaticvoidmain(字符串[]args)引发异常{
    //创建新的JTidy实例并设置选项
    整洁的,整洁的;
    tidy.setXHTML(true);
    //将HTML页面解析为DOM文档
    URL=新URL(“http://www.cs.grinnell.edu/~walker/fluency book/labs/sample table.html”);
    Document doc=tidy.parseDOM(url.openStream(),System.out);
    //使用XPath从(X)HTML中获取所需内容
    XPath=XPathFactory.newInstance().newXPath();
    XPathExpression expr=xpath.compile(//td[@valign='top']/a/text());
    NodeList节点=(NodeList)expr.evaluate(doc,XPathConstants.NODESET);
    列表文件名=新的ArrayList();
    对于(int i=0;i
    结果将是
    [整数处理:,图像处理:,相册:,运行时实验:,更多运行时实验:


    你可以使用的另一个很酷的工具是。它基本上完成了我上面所做的一切,但使用XML文件来配置提取管道。

    如果您所做的只是将一个表刮到一个数据文件中,那么regex就可以了,甚至可能比使用DOM文档更好。DOM文档将占用大量内存(特别是对于非常大的数据表),因此您可能需要一个用于大型文档的SAX解析器。

    您可以试试。这是一个很好的库,有很好的示例代码。

    这是一个优雅的解决方案,但对于一些简单的刮取来说,这是一个致命的错误。构建一个大型网页的dom会非常慢(最初的例子是一个小页面,但通常现在大多数网页都有复杂的dom)。我看了一下jSoup文档,它看起来非常好。我一直在为Python寻找BeautifulSoup中的一些东西,现在就在这里!