标签: html-agility-pack

如何使用HTML Agility Pack编辑HTML片段

所以我有一个HTML代码片段,我想用C#修改.

<div>
This is a specialSearchWord that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that specialSearchWord again.
</div>
Run Code Online (Sandbox Code Playgroud)

我想把它转换成这个:

<div>
This is a <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> again.
</div>
Run Code Online (Sandbox Code Playgroud)

我将根据这里的许多建议使用HTML Agility Pack,但我不知道我要去哪里.特别是,

  1. 如何将部分片段加载为字符串,而不是完整的HTML文档?
  2. 怎么编辑?
  3. 然后如何返回已编辑对象的文本字符串?

c# html-agility-pack

15
推荐指数
1
解决办法
1万
查看次数

Htmlagilitypack:创建html文本节点

在HtmlAgilityPack中,我想创建HtmlTextNode,它是一个HtmlNode(来自HtmlNode的inherts),它有一个自定义的InnerText.

HtmlTextNode CreateHtmlTextNode(string name, string text)
{
     HtmlDocument doc = new HtmlDocument();
     HtmlTextNode textNode = doc.CreateTextNode(text);
     textNode.Name = name;
     return textNode;
}
Run Code Online (Sandbox Code Playgroud)

问题是在上面的方法之后textNode.OuterHtml,textNode.InnerHtml它将等于"text".

例如,CreateHtmlTextNode("title", "blabla")将生成: textNode.OuterHtml = "blabla"而不是<Title>blabla</Title>

有没有更好的创作方式HtmlTextNode

c# html-agility-pack

15
推荐指数
2
解决办法
2万
查看次数

HtmlAgilityPack文档

我是C#的新手(今天开始),我正在尝试理解其他人使用HtmlDocumentHtmlAgilliyPack中的类来解析HTML文档的代码.我找不到这个包的任何文档.该HtmlAgilityPack的项目网页上说,没有可用文档.如果有人可以指出我的文档或解释以下方法(中间方法)那么这将是非常有用的:

 - HtmlDocument.DocumentNode
 - HtmlDocument.DocumentNode.ssn
 - HtmlDocument.DocumentNode.GetElementbyId
 - HtmlDocument.DocumentNode.GetElementbyId(..).sns
 - HtmlDocument.DocumentNode.ssn(...).Attributes["value"].Value.ed().ns()
Run Code Online (Sandbox Code Playgroud)

提前致谢!

c# html-agility-pack

15
推荐指数
2
解决办法
1万
查看次数

HtmlAgilityPack和Selenium Webdriver返回随机结果

我正试图从网站上删除产品名称.奇怪的是,我似乎只抓了12件物品.我已经尝试了HtmlAgilityPack和HTTPClient,我得到了相同的随机结果.这是我的HtmlAgilityPack代码:

using HtmlAgilityPack;
using System.Net.Http;

var url = @"http://www.roots.com/ca/en/men/tops/shirts-and-polos/";
HtmlWeb web = new HtmlWeb();
var doc = web.Load(url, "GET", proxy, new NetworkCredential(PROXY_UID, PROXY_PWD, PROXY_DMN));
var nodes = doc.DocumentNode.Descendants("div")
            .Where(div => div.GetAttributeValue("class", string.Empty) == "product-name")
            .Select(div => div.InnerText.Trim())
            ;
Run Code Online (Sandbox Code Playgroud)

[更新1] @CodingKuma建议我试试Selenium Webdriver.这是我使用Selenium Webdriver的代码:

IWebDriver chromeDriver = new ChromeDriver(@"C:\TEMP\Projects\Chrome\chromedriver_win32");
chromeDriver.Url = "http://www.roots.com/ca/en/men/tops/shirts-and-polos/";
var items = chromeDriver.FindElements(By.ClassName("product-name"));
items.Count().Dump();
chromeDriver.Quit();
Run Code Online (Sandbox Code Playgroud)

我尝试了这段代码,但仍然没有运气.该页面上有20多个项目,但我似乎只是随机获得12.如何抓取该网站上的所有项目?

c# web-crawler web-scraping html-agility-pack selenium-webdriver

15
推荐指数
2
解决办法
1562
查看次数

HTML敏捷包 - 如何在Head元素的顶部追加元素?

我正在尝试使用HTML Agility Pack将脚本元素附加到我的html的HEAD部分的顶部.到目前为止我看到的例子只是用这个AppendChild(element)方法来完成这个.我需要将我附加到head部分的脚本放在其他脚本之前.我怎么指定这个?

这是我正在尝试的:

HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.Load(filePath);
HtmlNode head = htmlDocument.DocumentNode.SelectSingleNode("/html/head");
HtmlNode stateScript = htmlDocument.CreateElement("script");
head.AppendChild(stateScript);
stateScript.SetAttributeValue("id", "applicationState");
stateScript.InnerHtml = "'{\"uid\":\"testUser\"}'";
Run Code Online (Sandbox Code Playgroud)

我想在HEAD的顶部添加一个脚本标记,而不是在末尾附加.

.net c# html-agility-pack asp.net-mvc-2

14
推荐指数
2
解决办法
2万
查看次数

Htmlagilitypack中的GetElementsByTagName

如果我不知道它的id,如何为文本框选择一个元素?

如果我知道它的id,那么我可以简单地写:

HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id);
Run Code Online (Sandbox Code Playgroud)

但是我不知道textbox的ID,我在HtmlagilityPack中找不到GetElementsByTagName方法,它在webbrowser控件中可用.在Web浏览器控件中我可以简单地写:

HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form");
foreach (HtmlElement currentElement in elements)
{

}
Run Code Online (Sandbox Code Playgroud)

编辑

这是我正在谈论的HTML表单

<form id="searchform" method="get" action="/test.php">
<input name="sometext" type="text">
</form>
Run Code Online (Sandbox Code Playgroud)

请注意我不知道表格的ID.并且在同一页面上可以有多种形式.我唯一知道的是"sometext",我想用这个名字来获取这个元素.所以我想我必须逐个解析所有表格然后找到这个名字"sometext"但是我该怎么做?

c# webbrowser-control getelementsbytagname html-agility-pack

14
推荐指数
3
解决办法
3万
查看次数

在HtmlAgilityPack中运行脚本

我正在尝试抓一个如下工作的特定网页.

首先加载页面,然后它运行某种javascript来获取填充页面所需的数据.我对这些数据很感兴趣.

如果我使用HtmlAgilityPack获取页面 - 脚本没有运行,所以我得到它本质上是一个空白页面.

有没有办法强制它运行脚本,所以我可以获取数据?

javascript c# html-agility-pack

14
推荐指数
1
解决办法
2万
查看次数

使用html agility pack获取课堂链接

有一堆与类alt的tr.我想得到所有链接(或最后一个)但我无法弄清楚如何使用html敏捷包.

我试过a的变种,但我只得到所有的链接或没有.它似乎只是在节点中得到一个没有意义的,因为我正在编写n.SelectNodes

html.LoadHtml(page);
var nS = html.DocumentNode.SelectNodes("//tr[@class='alt']");
foreach (var n in nS)
{
  var aS = n.SelectNodes("a");
  ...
}
Run Code Online (Sandbox Code Playgroud)

c# html-agility-pack

13
推荐指数
2
解决办法
1万
查看次数

使用BrowserSession和HtmlAgilityPack通过.NET登录Facebook

我正在尝试使用Rohit Agarwal的BrowserSession课程和HtmlAgilityPack登录并随后浏览Facebook.

我之前通过编写自己的HttpWebRequest来管理同样的事情.但是,它只适用于我从浏览器手动获取cookie并在每次进行新的"会话"时向请求中插入新的cookie字符串.现在我正在尝试使用BrowserSession来获得更智能的导航.

这是当前的代码:

BrowserSession b = new BrowserSession();

b.Get(@"http://www.facebook.com/login.php");
b.FormElements["email"] = "some@email.com";
b.FormElements["pass"] = "xxxxxxxx";
b.FormElements["lsd"] = "qDhIH";
b.FormElements["trynum"] = "1";
b.FormElements["persistent_inputcheckbox"] = "1";

var response = b.Post(@"https://login.facebook.com/login.php?login_attempt=1");
Run Code Online (Sandbox Code Playgroud)

以上工作正常.当我尝试再次使用此BrowserSession来获取另一个页面时出现问题.我这样做是因为BrowserSession保存了来自最后一个响应的cookie并将它们插入到下一个请求中,因此我不应该再手动从我的浏览器中取出的cookiedata.

但是,当我尝试做这样的事情时:

var profilePage = b.Get(@"https://m.facebook.com/profile.php?id=1111111111");
Run Code Online (Sandbox Code Playgroud)

我得到的文件是空的.我会很感激我对错误的看法.

.net c# cookies html-agility-pack

13
推荐指数
2
解决办法
2万
查看次数

Html Agility Pack SelectSingleNode在迭代中总是给出相同的结果?

我想要集合中的节点,但迭代SelectSingleNode我继续获得相同的对象只是node.Id正在改变...我尝试的是读出给定网站的web响应并捕获一些信息,如值,链接.. in特殊定义的元素.

int offSet = 0;
string address = "http://www.testsite.de/ergebnisliste.html?offset=" + offSet;

HtmlWeb web = new HtmlWeb();
//web.OverrideEncoding = Encoding.UTF8;
HtmlDocument doc = web.Load(address);

HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//div[@itemtype='http://schema.org/Posting']");

foreach (HtmlNode node in collection) {
    string id = HttpUtility.HtmlDecode(node.Id);
    string cpname = HttpUtility.HtmlDecode(node.SelectSingleNode("//span[@itemprop='name']").InnerText);
    string cptitle = HttpUtility.HtmlDecode(node.SelectSingleNode("//span[@itemprop='title']").InnerText);
    string cpaddress = HttpUtility.HtmlDecode(node.SelectSingleNode("//span[@itemprop='addressLocality']").InnerText);
    string date = HttpUtility.HtmlDecode(node.SelectSingleNode("//div[@itemprop='datePosted']").InnerText);
    string link = "http://www.testsite.de" + HttpUtility.HtmlDecode(node.SelectSingleNode("//div[@class='h3 title']//a[@href]").GetAttributeValue("href", "default"));               
}
Run Code Online (Sandbox Code Playgroud)

例如,这是1次迭代:

<div id="66666" itemtype="http://schema.org/Posting">   
<div>
    <a>
        <img />
    </a>
</div>
<div>
    <div class="h3 title">
        <a href="/test.html"  title="Test"> …
Run Code Online (Sandbox Code Playgroud)

html c# selectsinglenode html-agility-pack

13
推荐指数
1
解决办法
9706
查看次数