java - 使用 jsoup 提交搜索查询

标签 java android html-parsing jsoup html-parser

<form action="http://www.lyricsfreak.com/search.php">
    <input name="a" value="search" type="hidden">
    <input type="hidden" name="type" value="song">
    <input type="text" name="q" class="searchinp" placeholder="Search artist, albums and songs">
    <input value="Search" type="submit" class="srchbtn searchst" data-tracking='["Search","Lyrics","Search button"]'>
    <a href="http://www.lyricsfreak.com/search.php" class="srchadv" data-tracking='["Search","Lyrics","Advanced search"]'>Advanced search</a>
</form>

我知道这个问题已经被问过了,但这对我来说不起作用。实际上在这个网站上,当我什至复制 url 并粘贴到其他选项卡时,它首先显示错误,然后在几秒钟后再次重新加载并显示所需的页面,所以我无法在第一次尝试时获得该值。如果有人能给我任何解决方案,那就太好了。如您所见,我是 stackoverflow 的新手,如果我犯了任何错误,那么抱歉......

最佳答案

链接http://www.lyricsfreak.com/search.php不可用,这就是它显示错误的原因。当您说它有时会列出时,实际发生的是重定向到主页。所以不要使用 http://www.lyricsfreak.com/search.php你可以使用主页链接 http://www.lyricsfreak.com/

基于评论的样本

好的。我想您想在使用 jsoup 从 java 程序搜索后阅读轨道。 lyricsfreak 的问题在于它会在返回结果之前检查来源。如果源查询不是 lyricsfreak.com,它会重定向到 access_error.htm,并从那里使用下面的脚本再次提交,以便在 3.5 秒后获得结果

<script type="text/javascript">
    var redirect_url = document.location.href.match(/\?(.*)/);
    redirect_url = redirect_url ? '/search.php?' + redirect_url[1] : '/';
    setTimeout(function() { document.location.href = (redirect_url); }, 3500);
</script>

因此,您在这里可以做的是通过 jsoup 将 referrer 设置为“lyricsfreak.com”,它会在没有 access_error 的情况下为您提供正确的结果。所以示例代码如下。当然,您可以以更好的方式解析页面,但这只是给您一个想法。

import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class LyricsParser {

    public static void main(String[] args) throws Exception {

        String SEARCH_STRING = "Madonna";
        String URL = "http://www.lyricsfreak.com/search.php?a=search&type=song&q=";

        List<String> artists = new ArrayList<String>();
        List<String> songs = new ArrayList<String>();
        List<String> hits = new ArrayList<String>();

        Document doc = Jsoup.connect(URL + SEARCH_STRING)
                .referrer(URL + SEARCH_STRING).get();

        for(Element tracks : doc.select("td.colfirst")){
            for(Element links : tracks.getElementsByTag("a")){
                artists.add(links.text());
            }
        }

        for(Element tracks : doc.select("td > a.song")){
            for(Element links : tracks.getElementsByTag("a")){
                songs.add(links.text());
            }
        }

        for(Element tracks : doc.select("td.colast")){
            hits.add(tracks.text());
        }

        int length = artists.size();
        for(int i=0; i<length; i++){
            System.out.println("[" + artists.get(i) + ",\t" + songs.get(i) + ",\t" + hits.get(i+1) + "]");
        }
    }

}

关于java - 使用 jsoup 提交搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23608452/

相关文章:

java - RecyclerView 从另一个类中删除一个项目

java - Android AdView NoClassDefFoundError

java - jsoup是否下载CSS、JS和图片

linux - 在 Linux 中,获取两个字符串之间的内容

java - 基于配置启用/禁用 JUnit 测试

java - 如何将 'string-array' 从 XML 转换为 Java 中的字符串数组?

java - 使用android sdk检索通话记录

python - 解析 Wunderground 中的 HTML 数据

java - Java 中如何在 ArrayList 和 TreeSet 之间共享元素?

java - HMS Map Kit - 如何将相机缩放设置为当前位置?