<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>
我知道这个问题已经被问到了,但这对我来说不起作用。实际上在这个网站,当我甚至复制网址并粘贴到其他选项卡时,它首先显示错误,然后几秒后再次重新加载并显示所需的页面,所以我无法在第一次尝试时获得该值。如果有人能给我任何解决方案,那将是很棒的。当你看到我的声誉时,如果我犯了任何错误,那么对于stackoverflow我是新手,那么抱歉......
答案 0 :(得分:1)
链接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>
所以你可以在这里做的是将referrer
设置为&#39; lyricsfreak.com&#39;通过jsoup,它会在没有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) + "]");
}
}
}