所以我有一个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,但我不知道我要去哪里.特别是,
在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#的新手(今天开始),我正在尝试理解其他人使用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)
提前致谢!
我正试图从网站上删除产品名称.奇怪的是,我似乎只抓了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
我正在尝试使用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的顶部添加一个脚本标记,而不是在末尾附加.
如果我不知道它的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
我正在尝试抓一个如下工作的特定网页.
首先加载页面,然后它运行某种javascript来获取填充页面所需的数据.我对这些数据很感兴趣.
如果我使用HtmlAgilityPack获取页面 - 脚本没有运行,所以我得到它本质上是一个空白页面.
有没有办法强制它运行脚本,所以我可以获取数据?
有一堆与类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) 我正在尝试使用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)
我得到的文件是空的.我会很感激我对错误的看法.
我想要集合中的节点,但迭代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)