- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 HtmlAgilityPack 抓取一些数据。
HTML 看起来像这样:
<div id="id-here">
<dl>
<dt> Field Name </dt>
<dd> Value for above field name </dd>
<dt> Field Name </dt>
<dd> Value for above field name </dd>
<dt> Field Name </dt>
<dd> Value for above field name </dd>
</dl>
</div>
现在我遇到的问题是,并不总是有一定数量的字段,所以我无法像这样可靠地访问每个字段:
//*[@id="id-here"]/dl[1]/dd[1]
因为 dd[1] 在一个页面上可能是一个名字,而在另一个页面上可能是一个电话,其中用户未能填写姓名,因此字段被隐藏。
所以我像这样获取所有 DT 和 DD 节点:
//*[@id="id-here"]/dl[1]/dt | //*[@id="id-here"]/dl[1]/dd
现在我检查每个节点,看看它是否匹配我想要的字段,并像这样获取 NextSibling 值:
foreach (HtmlNode node in details)
{
if (node.InnerText.Contains("Tel:")) telephone = node.NextSibling.InnerText;
if (node.InnerText.Contains("Email:")) email = node.NextSibling.InnerText;
}
这适用于电话,但由于某种原因,当“电子邮件:”节点出现时,NextSibling.InnerHTML
和 NextSibling.InnerText
都是空白的,尽管下一个兄弟肯定有数据。如果我真的转到 details
中的那个 node
并查看它,InnerHTML
是整个格式化链接和 InnerText
是电子邮件地址。
NextSibling.InnerText
是否因为 A 标签使其成为子标签或其他原因而无法正常工作?我查看了调试器,但在 NextSibling
下找不到我需要的信息。
我敢肯定答案简单得离谱,我就是想不通。有人让我摆脱痛苦吗?
最佳答案
发生这种情况的原因是如果node
是 dt
与其对应的 dd
分开的元素由一些空格组成的元素,然后是 node.NextSibling
是一个全空白文本节点(</dt>
和 <dd>
之间的空格)。如果你在调试器中查看它,你会看到 node.NextSibling
的 NodeType
是HtmlNodeType.Text
而不是 HtmlNodeType.Element
.
我建议创建一个方便的方法来获取 dt
的文本节点对应的dd
:
internal static string GetMatchingDdValue(HtmlNode dtNode)
{
var found = dtNode.SelectSingleNode("following-sibling::*[1][self::dd]");
return found == null ? "" : found.InnerText;
}
然后你可以像这样使用它:
if (node.InnerText.Contains("Tel:")) { telephone = GetMatchingDdValue(node); }
下面是我上面的方法中使用的有点棘手的 XPath 的分割:
(a) following-sibling::*
^ 选择所有共享相同的元素 父节点作为当前节点并出现在它之后。
(b) following-sibling::*[1]
^ 选择集合(a)中的第一个节点 (如果有的话)
(c) following-sibling::*[1][self::dd]
^ 选择集合 (b) 中的所有节点 是名为“dd”的元素
SelectSingleNode()
选择集合 (c) 中的第一个节点,它应该始终是 1 个或 0 个节点。
你很可能只需要 following-sibling::dd
或 following-sibling::*
,但上述路径包含保障措施。例如,如果出于某种原因,您有以下 XML,并且您的当前节点是 Tel:
元素:
<dl>
<dt>Tel:</dt>
<dt>Address:</dt>
<dd>50 Fake St.</dd>
</dl>
following-sibling::dd
会给你结果“50 Fake St.”,而 following-sibling::*
会给你结果“地址:”。相反,following-sibling::*[1][self::dd]
在这种情况下会选择一个空节点集,因此该方法会正确地生成一个空字符串作为结果。
关于c# - HtmlAgilityPack NextSibling.InnerText 值为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25535284/
我们能够运行此代码 str.parentNode.nextSibling.tagName 并获得相应的名称。我们需要的是 nextSibling 之后的 nextSibling 所以我们尝试了这个 s
销毁自己的示波器时,我在程序中始终遇到此错误。我在角度范围内跟踪到了这个while循环: if (!(next = (current.$$childHead || (current !== targe
我目前正在做一个项目,我必须填充表格的不同列,因为我正在使用 .nextSibling,但是如果我定位,行可能会很长,让我们说第 4 列: firstTd.nextSibling.nextSiblin
这是我的代码,它没有发出任何警报,也没有返回任何好的 :(第一部分工作正常但事后它没有:(我似乎无法弄清楚问题是什么.. this.getNextItem = function(o) { //
我想知道属性 NextSibling 如何在使用方法 getElementsByClassName() 的情况下有效?这是显示问题的代码示例: function Sibling() { var
我希望下面的代码能够提醒“out” this is output 但它会提示 undefined为什么? 最佳答案 nextSibling 选择元素的下一个兄弟节点。下一个节点也可以是 textNo
function function1() { var m = document.getElementById("myNodeOne").nextSibling; m.innerHTM
我正在尝试使用以下内容获取内容“我的家庭地址”,但得到了 AttributeError: address = soup.find(text="Address:") print address.next
OT/UT ENTRY
此 Meteor 客户端代码尝试获取 2 个值。 (1)this.label中的值的{{this.label}}线。 (2){{this.result}}中的值在线 当我单击 input 时,就会发生
我目前正在编写一个 Accordion 并遇到了与 nextSibling difference between IE and FF? 中描述的相同问题。 - Microsoft 的 nextSibl
我看到这两个属性的描述是只读的。那么这意味着什么,因为我做了一个使用 firstChild 像 的小测试 $('#one').firstChild.textContent = "ssss"。 最佳答案
我确信这个问题有一个简单的答案,但我无法构建一个搜索问题来将其找出来。 我有多个“nextSibling”属性来在一组未经修饰的 td 标签之间移动,总共需要 22 个。 有没有办法将这些相乘,例如'
我有一个包含单元格的表格,我可以在其中输入值(该表格是一个时间表,我可以通过双击该单元格在单元格中输入房间号)。现在我想在 tab 键上添加一个键监听器。如果我按下 tab 键,当前单元格中的值应该被
当我调用 querySelectorAll('#fchildP') 并且想要获取它的firstChild 节点时,它返回数据属性为 的 #text node\n resp "breakline" 和
我正在尝试附加到多个 div 的下一个元素。到目前为止我有这个: HTML 函数运行后,内容应如下所示: My content My content My content 这是我迄今
我有以下 span 元素: Type here please. Name here first name 使用下面的js函数,我可以获得之间的长度和 : $('span.insid
这不完全是代码中的问题,但我无法理解问题背后的原因。首先,请看一下代码: HTML: Head First : Javascript
我仍在尝试了解 NextSibling,并且我在 excel VBA 中使用 XMLHTTP。 这是元素的 HTML
我正在使用 HtmlAgilityPack 抓取一些数据。 HTML 看起来像这样: Field Name Value for above field name
我是一名优秀的程序员,十分优秀!