【问题标题】:ParseException while retrieving comments from Youtube video从 Youtube 视频中检索评论时出现 ParseException
【发布时间】:2013-08-29 08:32:24
【问题描述】:

我想从 youtube 视频中获取所有 cmets(最多 999 个)。这是我要发送的网址

http://gdata.youtube.com/feeds/api/videos/1EEFydL6ooA/comments?start-index=1&max-results=50

当我发送此 URL 时,我收到 com.google.gdata.util.ParseException [Line 1, Column 279] Invalid root element, expected (namespace uri:local name) of (http://www.w3.org/2005/Atom:entry), found (http://www.w3.org/2005/Atom:feed

实际上,当我的 URL 是“http://gdata.youtube.com/feeds/api/videos/1EEFydL6ooA”时,我得到了 25 cmets(如果有的话)。但是,由于这是关于一个视频,我无法设置 max-results 和 start-index 参数。我的代码是:

    String str = "http://gdata.youtube.com/feeds/api/videos/" + videoId
        + "/comments";
    YouTubeQuery youtubeQuery = new YouTubeQuery(new URL(str));
    youtubeQuery.setMaxResults(50);
    youtubeQuery.setStartIndex(1);
    String videoEntryUrl = youtubeQuery.getUrl().toString();
    VideoEntry videoEntry = service.getEntry(new URL(videoEntryUrl),
            VideoEntry.class);
    if (videoEntry.getComments() != null) {
        String commentUrl = videoEntry.getComments().getFeedLink()
                .getHref();
        System.out.println(commentUrl);
        CommentFeed commentFeed = service.getFeed(new URL(commentUrl),
                CommentFeed.class);
        for (int i = 0; i < commentFeed.getEntries().size()
                && commentFeed.getEntries().get(i) != null; i++) {

            String author=commentFeed.getEntries().get(i).getAuthors().get(0)
                            .getUri().substring(41)
            String commentId=commentFeed.getEntries().get(i).getId().substring(47);
            String comment=commentFeed.getEntries().get(i).getPlainTextContent();

为什么我会收到 parseException?也许是因为这段代码相应地工作 VideoEntry 对象并以这种方式完成解析。有没有像 CommentEntry 这样的东西?有的话怎么初始化?

请注意,我的异常不是“com.google.gdata.util.ParseException: [Line 1, Column 101152, element yt:state] Invalid value for attribute : 'name'”,这是由于库错误。

谢谢

【问题讨论】:

    标签: xml-parsing youtube-api gdata


    【解决方案1】:

    我无法尝试您的代码。它看起来像 PHP 库。 在我看来,您使用了错误的课程。开头的 url 是关于 cmets 的,尽管您将其称为 videoEntry。

    (1) 这是关于 cmets 的(因为您附加了“/cmets”):

    String str = "http://gdata.youtube.com/feeds/api/videos/" + videoId + "/comments";
    

    (2) YouTubeQuery youtubeQuery = new YouTubeQuery(new URL(str));

    youtubeQuery.setMaxResults(50);
    youtubeQuery.setStartIndex(1);
    

    (3) 尽管您将其命名为“videoEntry”,但它是关于“cmets”的,由于 url 的值:

    String videoEntryUrl = youtubeQuery.getUrl().toString();
    
    VideoEntry videoEntry = service.getEntry(new URL(videoEntryUrl), VideoEntry.class);
    

    代替上述方法,也许可以尝试以下方法:

    String myUrl = youtubeQuery.getUrl().toString();  // only another name
    
    CommentFeed commentFeed = service.getFeed(new URL(myUrl), CommentFeed.class); // Feed response
    

    顺便说一句:在 PHP 库中,它自己检测提要的类,第二个参数可以保留为空。喜欢:CommentFeed commentFeed = service.getEntry(new URL(myUrl));

    【讨论】:

    • 顺便说一句。 PHP 库使用: $youTubeService>setMajorProtocolVersion(2);使用 api 版本 2。(URL 中的“v=2”参数。)
    • 它是关于 cmets 因为我希望它是关于“cmets” 在我没有在那个 URL 中附加“/cmets”之前它不是关于“cmets”。我只想使用这个 URL 创建一个 CommentEntry 对象,但我不能这样做
    • 在您的代码中,第 7 行:“service.getEntry(new URL(videoEntryUrl), VideoEntry.class);”。这里 videoEntryUrl 是 "gdata.youtube.com/feeds/api/videos" + videoId + "/cmets";这是cmets的饲料。因此使用 VideoEntry.class 是错误的。
    • 我知道我使用 VideoEntry.class 是错误的。我想要别的东西。当 URL 为“gdata.youtube.com/feeds/api/videos/"+ videoID”时,我的代码有效。但是,由于它仅适用于 1 个视频,因此我不能使用 max-results 和 start-index 参数。因此,我需要使用评论提要。所以,不要更改我的URL,我必须更改我的 VideoEntry。我需要 CommentEntry,不是吗?但我不能使用 CommentENTry 类
    • 我不这么认为。根据您发送的网址,响应将是条目或提要。使用 url "gdata.youtube.com/feeds/api/videos/"+ videoID 响应是一个条目。此视频条目包含其 cmets-feed 的 url,您可以从该视频条目获取或自己编写它;您在代码开始时在这里执行的操作。在这里,您立即开始使用 cmets 提要。阅读响应(评论提要),每一步都将是一个评论条目。
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2013-11-21
    • 2016-05-10
    • 2013-02-06
    相关资源
    最近更新 更多