【问题标题】:How do you parse a web page and extract all the href links?您如何解析网页并提取所有 href 链接?
【发布时间】:2010-09-11 02:05:31
【问题描述】:

我想在 Groovy 中解析一个网页并提取所有的 href 链接和相关的文本。

如果页面包含这些链接:

<a href="http://www.google.com">Google</a><br />
<a href="http://www.apple.com">Apple</a>

输出将是:

Google, http://www.google.com<br />
Apple, http://www.apple.com

我正在寻找一个 Groovy 的答案。又名。最简单的方法!

【问题讨论】:

    标签: html parsing groovy


    【解决方案1】:

    假设 XHTML 格式正确,读取 xml,收集所有标签,找到“a”标签,然后打印出 href 和文本。

    input = """<html><body>
    <a href = "http://www.hjsoft.com/">John</a>
    <a href = "http://www.google.com/">Google</a>
    <a href = "http://www.stackoverflow.com/">StackOverflow</a>
    </body></html>"""
    
    doc = new XmlSlurper().parseText(input)
    doc.depthFirst().collect { it }.findAll { it.name() == "a" }.each {
        println "${it.text()}, ${it.@href.text()}"
    }
    

    【讨论】:

    • 由于一个简单但真实的原因,这种方法不会很好地工作 - 通常网站没有格式良好的 XML。它在某些情况下会起作用,但不是全部。
    • 这是一个很好的链接:blog.stannard.net.au/2010/05/12/…
    【解决方案2】:

    快速的谷歌搜索发现了一个不错的选择,TagSoup

    【讨论】:

    • 该站点提供了一个完整的 TagSoup 示例。 cyblex.at/blog/?p=83 我不得不更改一些引号(' 和 ")才能让它运行,但这个例子非常好。作者下载了所有 *.mp4 文件。
    【解决方案3】:

    我不懂 java,但我认为 xpath 比经典正则表达式要好得多,以便获取一个(或多个)html 元素。

    它也更容易书写和阅读。

    <html>
       <body>
          <a href="1.html">1</a>
          <a href="2.html">2</a>
          <a href="3.html">3</a>
       </body>
    </html>
    

    使用上面的html,这个表达式“/html/body/a”将列出所有href元素。

    这里有一个很好的分步教程http://www.zvon.org/xxl/XPathTutorial/General/examples.html

    【讨论】:

      【解决方案4】:

      使用 XMLSlurper 将 HTML 解析为 XML 文档,然后使用带有适当闭包的 find 方法选择 a 标签,然后使用 GPathResult 上的 list 方法获取标签列表。然后,您应该能够将文本提取为 GPathResult 的子项。

      【讨论】:

        【解决方案5】:

        试试正则表达式。像这样的东西应该可以工作:

        (html =~ /<a.*href='(.*?)'.*>(.*?)<\/a>/).each { url, text -> 
            // do something with url and text
        }
        

        看看Groovy - Tutorial 4 - Regular expressions basicsAnchor Tag Regular Expression Breaking

        【讨论】:

        【解决方案6】:

        仅当 HTMl 格式正确时,使用 XMlSlurper 进行解析才有效。

        如果您的 HTMl 页面包含格式不正确的标签,则使用正则表达式来解析页面。

        例如:&lt;a href="www.google.com"&gt;

        这里,'a' 没有闭合,因此格式不正确。

         new URL(url).eachLine{
           (it =~ /.*<A HREF="(.*?)">/).each{
               // process hrefs
           }
        }
        

        【讨论】:

          【解决方案7】:

          HTML解析器+正则表达式 任何语言都可以,尽管我认为 Perl 是最快的解决方案。

          【讨论】:

            猜你喜欢
            • 2018-03-22
            • 2014-01-30
            • 2017-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多