Xpath returns 空网页抓取

Xpath returns null Web Scraping

我正在执行网络抓取,我尝试了所有可能的组合,但 XPath 返回 null 值。

我删除了方括号并为其添加了 //,但每次都是 returns null。 这些是实际的 XPath,我附上了我在代码中使用的格式化的。

//*[@id="agent_list_wrapper"]/div[2]/div[2]/div/div[1]/a
//*[@id="agent_list_wrapper"]/div[2]/div[2]/div/div[3]

下面是我的代码。

private async Task<List<NameAndphone>> WebDateFromPage(int pagenum)
{
    string url = "http://www.realtor.com/realestateagents/New-York_NY/photo-1";

    if (pagenum != 0)
        url = "http://www.realtor.com/realestateagents/New-York_NY/photo-1/pg-" + pagenum.ToString();

    var doc = await Task.Factory.StartNew(() => web.Load(url));
    var name = doc.DocumentNode.SelectNodes("//*[@id=\"agent_list_wrapper\"]//div//div//div/div//a");
    var phone = doc.DocumentNode.SelectNodes("//*[@id=\"agent_list_wrapper\"]//div//div//div//div");
    if (name == null || phone == null)
        return new List<NameAndPhone>();

    var names = name.Select(node => node.InnerText);
    var phones = phone.Select(node => node.InnerText);

    return names.Zip(phones, (name, phone) => new NameAndPhone() { Name = name, Phone = phone }).ToList();
}

您的 XPATH 似乎工作正常(尽管数据本身需要一些清理)。使用此代码进行测试:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.OptionFixNestedTags = true;
doc.Load("data.xml");

var name = doc.DocumentNode.SelectNodes("//*[@id=\"agent_list_wrapper\"]//div//div//div/div//a");
var phone = doc.DocumentNode.SelectNodes("//*[@id=\"agent_list_wrapper\"]//div//div//div//div");


var names = name.Select(node => node.InnerText);
var phones = phone.Select(node => node.InnerText);

var result = names.Zip(phones, (n, p) => new { Name = n, Phone = p }).ToList();
//Result has 58 items

将此 url 用于测试数据:http://www.realtor.com/realestateagents/New-York_NY/photo-1/pg-1


我建议您重新考虑您的 XPATH,因为它非常具体并且取决于结构。尝试使用以下属性:itemprop="name"itemprop="telephone" - 如果他们更改网站布局,则不太可能更改

使用以下代码实现

谢谢

string url_base=@"http://www.realtor.com/realestateagents/New-York_NY/photo-1/pg-";
function GetPageContent(int page_no)
{
   return new System.Net.WebClient().DownloadString(url_base+page_no);
}
var file_path=@"C:\Dump\Data.xml";

var content=GetPageContent(1);

System.IO.File.WriteAllText(file_path,content);


HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.OptionFixNestedTags = true;
doc.Load(file_path);

var name = doc.DocumentNode.SelectNodes("//*[@id=\"agent_list_wrapper\"]//div//div//div/div//a");
var phone = doc.DocumentNode.SelectNodes("//*[@id=\"agent_list_wrapper\"]//div//div//div//div");


var names = name.Select(node => node.InnerText);
var phones = phone.Select(node => node.InnerText);

var result = names.Zip(phones, (n, p) => new { Name = n, Phone = p }).ToList();
//Result has 58 items