如何解决HtmlAgilityPack如何获取由js添加的div?
今天,我想编写一个可通过日历网站搜索并找到事件标签的网络爬虫,以便我可以搜索它们并获取有关该事件的工作人员的信息。
问题是:我要搜索的div是由js添加的,那么如何使用htmlagilitypack获得它?
我的代码:
using System;
using HtmlAgilityPack;
using System.Linq;
using System.Diagnostics;
using System.Threading;
namespace ESEL_Scraper
{
class Program
{
static void Main(string[] args)
{
string Url = $"https://esel.at/termine";
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(Url);
HtmlNode[] nodes = doc.DocumentNode.SelectNodes("//div[@class='content']").ToArray();
for(int i = 0; i < nodes.Length; i++) {
Console.WriteLine(nodes[i].InnerText);
}
}
}
}
解决方法
SelectNodes在找不到您要查找的内容时返回null。这就是为什么您会得到null异常的原因。没有class =“ content”的“ div”元素。如果更改为该页面上的div元素使用的类,则会得到结果。
对于HtmlAgility包“ SelectNodes”,您需要以某种方式进行空检查,然后再使用结果。
,短答案:不能。使用HtmlAgilityPack无法解析网页中的数据,而该数据是在页面加载时添加的-页面的初始源代码没有数据。 长答案:可能有一些API调用可以获取事件数据,然后通过javascript将其推送到页面。尝试找出使用了什么URL,然后尝试对其进行解析。就是这样:https://esel.at/api/termine/data?date=05.09.2020&selection=false
,如前所述,JavaScript会附加内容。使用基本的网络检查,您会发现还有另一个网络请求。
您在这里得到的是JSON格式的数据,该数据使用Javascript附加在HTML中。 代替使用HtmlAgility包,您将需要解析JSON。在下面的示例中,我使用了Newtonsoft.Json软件包。
代码如下:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
namespace ESEL_Scraper
{
internal class Program
{
private static void Main(string[] args)
{
//Simply create request to the API and deserialize JSON using the Root class
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
CookieContainer cookies = new CookieContainer();
// Set the date you want in the link,in this example it's 06.09.2020
var request = (HttpWebRequest)WebRequest.Create("https://esel.at/api/termine/data?date=06.09.2020&selection=false");
request.CookieContainer = cookies;
request.Method = "GET";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/64.0.3282.186 Safari/537.36";
request.ContentType = "application/json";
request.Headers.Add("accept-language","en,hr;q=0.9");
request.Headers.Add("accept-encoding","");
request.Headers.Add("Upgrade-Insecure-Requests","1");
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(),Encoding.UTF8);
string responseFromServer = reader.ReadToEnd();
reader.Close();
response.Close();
//Deserialize Json
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(responseFromServer);
foreach (var el in myDeserializedClass.termine)
{
//Get any field you need
Console.WriteLine(el.title);
Console.WriteLine(el.location);
}
Console.ReadLine();
}
}
// Based on the JSON response https://pastebin.com/Xa5gSp50 I have generated classes using this website: https://json2csharp.com/
public class Termine
{
public int id { get; set; }
public string title { get; set; }
public string category { get; set; }
public string startdate { get; set; }
public string startdatetime { get; set; }
public string starttime { get; set; }
public string enddate { get; set; }
public List<object> runtime { get; set; }
public string thumbnail { get; set; }
public string thumbnail_credits { get; set; }
public string type { get; set; }
public string recommended { get; set; }
public bool online_event { get; set; }
public object feed_urls { get; set; }
public string status { get; set; }
public string tags { get; set; }
public string url { get; set; }
public string sort_date { get; set; }
public string sort_category { get; set; }
public string location_url { get; set; }
public string location { get; set; }
}
public class Meta
{
public List<string> next { get; set; }
public DateTime now { get; set; }
public List<string> date { get; set; }
public DateTime end { get; set; }
public DateTime runtime { get; set; }
public int upcoming { get; set; }
public int running { get; set; }
public int termine { get; set; }
}
public class Root
{
public List<Termine> termine { get; set; }
public Meta meta { get; set; }
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。