【问题标题】:How to parse full text webpage from this page?如何从此页面解析全文网页?
【发布时间】:2016-04-03 15:21:20
【问题描述】:

我需要从此页面获取曲目名称,但我得到不完整的响应

var response = await client.GetStringAsync(new Uri("http://parmismedia1.com/musicplayeralbum.aspx?album=666&id=8503&title=farzad-farzin-6-to-che-bashi"));

我使用了 firefox 检查器,发送了 post 请求,使用了移动和桌面用户代理字符串,但仍然得到不完整的响应。 但我注意到,当我使用该地址在 uc 浏览器上创建下载任务时,我得到了整页文本。 如何获取完整的页面文本?

【问题讨论】:

    标签: c# windows-runtime html-parsing


    【解决方案1】:

    在一个测试应用程序中,我使用了一个有效的 URL(在请求中不使用 &,而是直接使用 & 符号 &),并且响应正确返回:

    var client = new HttpClient();
    var response = await client.GetStringAsync(new Uri("https://parmismedia1.com/musicplayeralbum.aspx?album=666&id=8503&title=farzad-farzin-6-to-che-bashi"));
    

    话虽如此,您的原始查询也成功返回,它只是在完全返回之前进行了几次重定向。

    但是,我确实注意到返回的 HTML 页面并不完全有效,因为它在响应的开头包含错误信息:

    The process cannot access the file 'C:\inetpub\PMWebsite\Log\500_2016-04-03.log' because it is being used by another process.
    
    <!DOCTYPE html>
    <html lang="en" class="app">
    <head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /><title>
    

    您可能需要与网站的创建者核实,以检查是否可以抓取他们的 Web 应用程序内容,以及他们是否有您可以使用的直接 API。

    【讨论】:

      【解决方案2】:

      我仍在弄清楚为什么 client.GetStringAsync 不起作用,但我能够使用 System.Net.HttpWebRequest 获取页面 html。

      下面的代码示例。

      Uri address = new Uri("http://parmismedia1.com/musicplayeralbum.aspx?album=666&id=8503&title=farzad-farzin-6-to-che-bashi");
      HttpWebRequest httpRequest = WebRequest.Create(address) as HttpWebRequest;
      httpRequest.UseDefaultCredentials = true;
      httpRequest.ServicePoint.Expect100Continue = false;
      httpRequest.Proxy.Credentials = CredentialCache.DefaultCredentials;
      httpRequest.ProtocolVersion = HttpVersion.Version11;
      httpRequest.UserAgent = @"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0";
      httpRequest.Method = "GET";
      httpRequest.Timeout = 3000;
      HttpWebResponse response = httpRequest.GetResponse() as HttpWebResponse;
      StreamReader reader = new StreamReader(response.GetResponseStream());
      
      string html = reader.ReadToEnd();
      
      response.Close();
      

      【讨论】:

      • 它有效,我得到页面文本,但我的意思是它不包括包含曲目列表的部分。如果您在浏览器上打开页面,您可以看到左侧包含专辑封面和曲目的部分,而该部分未包含在已解析的文本中。
      • 您的回复文本是否包含曲目名称?
      • 是的,确实如此。也许您正在使用 VS 字符串检查器,有时它不会显示大字符串的所有内容。尝试添加类似 System.IO.File.WriteAllText(@"C:\temp\test.txt", html);并在文件中查看结果。或者在您的代码中测试歌曲名称,例如 bool containsThirdSong = html.Contains("3 - Dir Omadi");.
      • 是的,你是对的。文本可视化工具不显示全文。我可以通过 JSON 可视化工具查看全文。我总是毫无问题地使用文本可视化器。不敢相信我被困住了。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 2011-06-13
      • 1970-01-01
      相关资源
      最近更新 更多