我如何使用HTML Agility Pack?
我的XHTML文档并不完全有效.这就是我想要使用它的原因.我如何在我的项目中使用它?我的项目是在C#中.
我正在攻击html敏捷包并且无法找到正确的方法来解决这个问题.
例如:
var findclasses = _doc.DocumentNode.Descendants("div").Where(d => d.Attributes.Contains("class"));
Run Code Online (Sandbox Code Playgroud)
但是,显然你可以添加更多的类然后div,所以我尝试了..
var allLinksWithDivAndClass = _doc.DocumentNode.SelectNodes("//*[@class=\"float\"]");
Run Code Online (Sandbox Code Playgroud)
但是这并没有处理你添加多个类的情况,而"float"只是其中之一,就像这样.
class="className float anotherclassName"
Run Code Online (Sandbox Code Playgroud)
有没有办法处理所有这些?我基本上想要选择所有具有class =且包含float的节点.
**答案已记录在我的博客上,并附有完整说明:Html Agility Pack按类获取所有元素
HtmlAgilityPack是否能够将HtmlDocument对象中的整个 HTML标记作为字符串返回?
Html Agility Pack是前一段时间给出StackOverflow问题的答案,它仍然是最好的选择吗?还应该考虑哪些其他选择?有更轻量级的东西吗?
我想使用HTML敏捷包来解析复杂网页中的表,但我在对象模型中丢失了.
我查看了链接示例,但没有找到任何表数据.我可以使用XPath来获取表吗?在加载了关于如何获取表格的数据后,我基本上已经丢失了.我之前在Perl中做过这个,它有点笨拙,但很有效.(HTML::TableParser
).
如果能够解释正确的解析对象顺序,我也很高兴.
我目前正在使用带有控制台应用程序的HtmlAgilityPack来抓取一个网站.由于html是编码的(它返回编码的字符'
),我必须解码才能将内容保存到我的数据库.
有没有办法使用HtmlAgilityPack解码返回的html而不必使用HttpUtility.HtmlDecode?我希望尽可能避免将System.Web添加到我的控制台应用程序中.
我在这里看到了一些相关的问题,但他们并没有完全谈论我面临的同样问题.
我想使用HTML Agility Pack从HTML中删除不需要的标记,而不会丢失标记中的内容.
例如,在我的场景中,我想保留标签" b
"," i
"和" u
".
并输入如下:
<p>my paragraph <div>and my <b>div</b></div> are <i>italic</i> and <b>bold</b></p>
生成的HTML应为:
my paragraph and my <b>div</b> are <i>italic</i> and <b>bold</b>
我尝试使用HtmlNode
的Remove
方法,但它也删除了我的内容.有什么建议?
我知道如何获得相同css类的DIV列表,例如
<div class="class1">1</div>
<div class="class1">2</div>
Run Code Online (Sandbox Code Playgroud)
使用xpath //div[@class='class1']
但是如果div有多个类,例如
<div class="class1 class2">1</div>
Run Code Online (Sandbox Code Playgroud)
xpath会是什么样的呢?
希望有人可以帮助我.
假设我有一个包含多个div的html文档,如下例所示:
<div class="search_hit">
<span prop="name">Richard Winchester</span>
<span prop="company">Kodak</span>
<span prop="street">Arlington Road 1</span>
</div>
<div class="search_hit">
<span prop="name">Ted Mosby</span>
<span prop="company">HP</span>
<span prop="street">Arlington Road 2</span>
</div>
Run Code Online (Sandbox Code Playgroud)
我正在使用HtmlAgilityPack来获取html文档.我需要知道的是我如何获得每个"search_hit"-div的跨度?
我的第一个想法是这样的:
foreach (HtmlAgilityPack.HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("//span[@prop]"))
{
}
}
Run Code Online (Sandbox Code Playgroud)
每个div应该是包含spans作为属性的对象.I. e.
public class Record
{
public string Name { get; set; }
public string company { get; set; }
public string street { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后填写此清单:
public List<Record> Results = new List<Record>();
Run Code Online (Sandbox Code Playgroud)
但我正在使用的XPATH并没有在子节点中进行搜索,因为它应该这样做.它接缝一遍又一遍地搜索整个文档.
我的意思是我已经让它以这种方式工作,我只是得到整个页面的跨度.但后来我在跨度和div之间没有任何关系.意思是:我不知道哪个跨度与哪个div有关.
有人知道解决方案吗?我已经玩了很多,我现在完全糊涂了:) …
我试图使用HtmlAgilityPack库来解析页面中的一些链接,但我没有看到我期望从这些方法得到的结果.在下面我有一个HtmlNodeCollection的链接.对于每个链接,我想检查是否有图像节点,然后解析其属性,但linkNode的SelectNodes和SelectSingleNode方法似乎在搜索父文档而不是linkNode的childNodes给出了什么?
HtmlDocument htmldoc = new HtmlDocument();
htmldoc.LoadHtml(content);
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
foreach(HtmlNode linkNode in linkNodes)
{
string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
if (linkTitle == string.Empty)
{
HtmlNode imageNode = linkNode.SelectSingleNode("/img[@alt]");
}
}
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以获得linkNode的image childnode的alt属性(如果存在)?