C #으로 웹 페이지에서 JSON 스크랩하기

c# html-agility-pack

문제

C #의 새로운 기능과 비동기 작업 실행

웹 사이트에서 일부 음악 앨범 정보를 다 찍으려고합니다. 웹 페이지의 검색은 일반 텍스트로 JSON 객체를 생성하지만 DOM 정보에 액세스 할 수없는 것 같습니다. 여기에 내가 시도 (HtmlAgilityPack 사용) :

using HtmlAgilityPack;
using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1 {
public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    public async Task<String> AlbumScraper(string albumname) {

        HtmlWeb web = new HtmlWeb();

        string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=" + albumname);
        Console.Write(albumurl);
        var albumdoc = await Task.Factory.StartNew(() => web.Load(albumurl));
        string albumjson = "";

        if (albumdoc.DocumentNode != null) {
            albumjson = albumdoc.DocumentNode.InnerText;
        }

        return albumjson;
    }

    private async void Form1_Load(object sender, EventArgs e) {
        string rawtext = await AlbumScraper("rust+in+peace");
        Console.Write(rawtext);
    }
}
}

JSON 텍스트를 생성하려면 어떻게해야합니까? "albumurl"URL을로드 할 때 명확하게 볼 수 있습니다 ...

수락 된 답변

먼저 HtmlAgilityPack이 필요하지 않습니다.

둘째, 시도해보십시오.

using Newtonsoft.Json.Linq;

string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=rust+in+peace");
string doc = "";
using (System.Net.WebClient client = new System.Net.WebClient()) // WebClient class inherits IDisposable
{
    doc = client.DownloadString(albumurl);
}

당신은 그것을 deserialize 할 수 있습니다 (@itikhomi)

AlbumSearchResponse data = JsonConvert.DeserializeObject<AlbumSearchResponse>(doc);

수동으로 파싱 할 수도 있습니다.

JObject json = JObject.Parse(doc);
string error= Convert.ToString(json["error"]);
. . .
string aaData= Convert.ToString(json["aaData"]);
JArray arr = JArray.Parse(aaData);
foreach(JToken token in arr)
{
    string[] strarr = token.ToObject<string[]>();
}

인기 답변

당신은 온라인 도구 http://json2csharp.com/에서 그것을 생성 할 수 있습니다 그리고 생성 된 클래스를 코드에 추가하십시오

public class AlbumSearchResponse
    {
        public string error { get; set; }
        public int iTotalRecords { get; set; }
        public int iTotalDisplayRecords { get; set; }
        public int sEcho { get; set; }
        public List<List<string>> aaData { get; set; }
    }

응답 텍스트를 클래스로 변환

var data = JsonConvert.DeserializeObject<AlbumSearchResponse>(response);
        foreach (var item in data.aaData)
        {
            //do whatever your want with data
        }

또한 JsonConvert가 작동하도록 nuget에서 newtonsoft json 패키지를 추가해야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.