在我的HTML页面上,我有四十个div,但我只想要一个div
使用敏捷包来搜索并获取所有带有ID的div我使用它
"//div[@id]"
Run Code Online (Sandbox Code Playgroud)
但是我如何搜索带有ID的div,其中id包含文本"test"
<div id="outerdivtest1></div>"
Run Code Online (Sandbox Code Playgroud)
谢谢
我需要将HTML字符串转换为纯文本(最好使用HTML Agility包).适当的白色空间,特别是正确的换行符.
通过"正确的换行符"我的意思是这段代码:
<div>
<div>
<div>
line1
</div>
</div>
</div>
<div>line2</div>
Run Code Online (Sandbox Code Playgroud)
应转换为
line1
line2
Run Code Online (Sandbox Code Playgroud)
即只有一个换行符.
我见过的大多数解决方案只是简单地将所有<div> <br> <p>标签转换为\ns*cks.
有关C#的html到plaintext渲染逻辑的任何建议吗?不完整的代码,至少常见的逻辑答案,如"用换行符替换所有关闭的DIV,但只有当下一个兄弟也不是DIV"时才真正有用.
我试过的事情:简单地获取.InnerText属性(显然是错误的),正则表达式(缓慢,痛苦,大量黑客,还有正则表达式比HtmlAgilityPack慢12倍 - 我测量了它),此解决方案和类似(返回更多换行符然后需要)
我刚写了这个测试,看看我是不是疯了......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;
namespace HtmlAgilityPackFormBug
{
class Program
{
static void Main(string[] args)
{
var doc = new HtmlDocument();
doc.LoadHtml(@"
<!DOCTYPE html>
<html>
<head>
<title>Form Test</title>
</head>
<body>
<form>
<input type=""text"" />
<input type=""reset"" />
<input type=""submit"" />
</form>
</body>
</html>
");
var body = doc.DocumentNode.SelectSingleNode("//body");
foreach (var node in body.ChildNodes.Where(n => n.NodeType == HtmlNodeType.Element))
Console.WriteLine(node.XPath);
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
它输出:
/html[1]/body[1]/form[1]
/html[1]/body[1]/input[1]
/html[1]/body[1]/input[2]
/html[1]/body[1]/input[3]
Run Code Online (Sandbox Code Playgroud)
但是,如果我改变<form>到<xxx>它给了我:
/html[1]/body[1]/xxx[1]
Run Code Online (Sandbox Code Playgroud)
(正如它应该).所以...看起来那些输入元素 …
使用C#我想知道如何从这个示例html脚本获取Textbox值(即:john):
<TD class=texte width="50%">
<DIV align=right>Name :<B> </B></DIV></TD>
<TD width="50%"><INPUT class=box value=John maxLength=16 size=16 name=user_name> </TD>
<TR vAlign=center>
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个删除不在白名单中的html标签和属性的函数.我有以下HTML:
<b>first text </b>
<b>second text here
<a>some text here</a>
<a>some text here</a>
</b>
<a>some twxt here</a>
Run Code Online (Sandbox Code Playgroud)
我正在使用HTML敏捷包,到目前为止我的代码是:
static List<string> WhiteNodeList = new List<string> { "b" };
static List<string> WhiteAttrList = new List<string> { };
static HtmlNode htmlNode;
public static void RemoveNotInWhiteList(out string _output, HtmlNode pNode, List<string> pWhiteList, List<string> attrWhiteList)
{
// remove all attributes not on white list
foreach (var item in pNode.ChildNodes)
{
item.Attributes.Where(u => attrWhiteList.Contains(u.Name) == false).ToList().ForEach(u => RemoveAttribute(u));
}
// remove all html and their innerText …Run Code Online (Sandbox Code Playgroud) 这是抓取时获取网页的最佳方式吗?
HttpWebRequest oReq = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse resp = (HttpWebResponse)oReq.GetResponse();
var doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(resp.GetResponseStream());
var element = doc.GetElementbyId("//start-left");
var element2 = doc.DocumentNode.SelectSingleNode("//body");
string html = doc.DocumentNode.OuterHtml;
Run Code Online (Sandbox Code Playgroud)
我已经看到HtmlWeb().Load了一个网页.这是一个更好的替代加载和刮网页?
好的,我会试试.
HtmlDocument doc = web.Load(url);
Run Code Online (Sandbox Code Playgroud)
现在,当我得到我的doc,并没有得到如此mutch属性.没有人喜欢SelectSingleNode.我唯一可以使用的是GetElementById,但这有效但我想上课.
我需要这样做吗?
var htmlBody = doc.DocumentNode.SelectSingleNode("//body");
htmlBody.SelectSingleNode("//paging");
Run Code Online (Sandbox Code Playgroud) 输入
<html><body><p>foo <a href='http://www.example.com'>bar</a> baz</p></body></html>
Run Code Online (Sandbox Code Playgroud)
产量
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)
我知道htmldoc.DocumentNode.InnerText,但它会给foobarbaz- 我想得到每个文本,而不是一次.
我想将我的Asics运行计划导出到iCal,由于Asics不提供这项服务,我决定为自己个人使用构建一个小刮刀.我想要做的是从我的计划中获取所有计划的运行并基于此生成iCal源.我正在使用C#和Html Agility Pack.
我想要做的是遍历我所有的预定运行(它们是div节点).然后我想用我的运行节点选择几个不同的节点.我的代码看起来像这样:
foreach (var run in doc.DocumentNode.SelectSingleNode("//div[@id='scheduleTable']").SelectNodes("//div[@class='pTdBox']"))
{
number++;
string date = run.SelectSingleNode("//div[@class='date']").InnerText;
string type = run.SelectSingleNode("//span[@class='menu']").InnerHtml;
string distance = run.SelectSingleNode("//span[@class='distance']").InnerHtml;
string description = run.SelectSingleNode("//div[@class='description']").InnerHtml;
ViewData["result"] += "Dato: " + date + "<br />";
ViewData["result"] += "Tyep: " + type + "<br />";
ViewData["result"] += "Distance: " + distance + "<br />";
ViewData["result"] += "Description: " + description + "<br />";
ViewData["result"] += run.InnerHtml.Replace("<", "<").Replace(">", ">") + "<br />" + "<br />" + "<br />";
}
Run Code Online (Sandbox Code Playgroud)
我的问题是run.SelectSingleNode("//div[@class='date']").InnerText …
我想用另一个文本替换HTML标签的内部文本.我正在使用HtmlAgilityPack
我使用此代码来提取所有文本
HtmlDocument doc = new HtmlDocument();
doc.Load("some path")
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[normalize-space(.) != '']")) {
// How to replace node.InnerText with some text ?
}
Run Code Online (Sandbox Code Playgroud)
但是InnerText是只读的.如何用其他文本替换文本并将其保存到文件?
我有以下XPath来匹配类span的属性:
//span[@class='amount']
Run Code Online (Sandbox Code Playgroud)
我想匹配class属性为"amount"的所有元素,但也可能有其他类.我以为我能做到这一点:
//span[@class='*amount*']
Run Code Online (Sandbox Code Playgroud)
但这不起作用......我怎么能这样做?
c# ×9
html-parsing ×2
xpath ×2
asp.net-mvc ×1
html ×1
parsing ×1
sanitize ×1
tags ×1
web-scraping ×1