XPath 将 td 列的内容放在 HTML 页面上以进行屏幕抓取

本文关键字:抓取 屏幕 HTML td XPath | 更新日期: 2023-09-27 18:33:02

下面是用于筛选经济日历的代码摘录。它使用 XPath 解析的 HTML 页面包含此行作为第一个行在表中。(仅粘贴此行而不是整个 HTML 页面。

<tr class="calendar_row newday singleevent" data-eventid="42064"> <td class="date"><div class="date">Sun<div>Dec 23</div></div></td> <td class="time">All Day</td> <td class="currency">JPY</td> <td class="impact"> <div title="Non-Economic" class="holiday"></div> </td> <td class="event"><div>Bank Holiday</div></td> <td class="detail"><a class="calendar_detail level1" data-level="1"></a></td> <td class="actual"> </td> <td class="forecast"></td> <td class="previous"></td> <td class="graph"></td> </tr>

使用 XPath 选择第一行 tr 的代码:

var doc = new HtmlDocument();
doc.Load(new StringReader(html));
var rows = doc.DocumentNode.SelectNodes("//tr[@class='"calendar_row'"]");
var rowHtml = rows[0].InnerHtml;

问题是rowHtml返回了这个:

<td class="date"></td> <td class="time">All Day</td> <td class="currency">EUR</td> <td class="impact">  <div title="Non-Economic" class="holiday"></div>  </td> <td class="event"> <div>French Bank Holiday</div> </td> <td class="detail"><a class="calendar_detail level2" data-level="2"></a></td> <td class="actual"> </td> <td class="forecast"></td> <td class="previous"></td> <td class="graph"></td>

现在您可以看到日期的 td 列的内容消失了!为什么?

我已经尝试了很多东西,并困惑为什么它会删除该专栏的内容。其他列具有它保留的内容。那么日期列有什么问题呢?

是否有某种设置或属性会导致或防止内容丢失?

即使您不知道出了什么问题,但有一些建议可以进一步调查它。

XPath 将 td 列的内容放在 HTML 页面上以进行屏幕抓取

就像@AlexeiLevenkov提到的,您必须选择与所需不同的行。 为了简化,你已经修剪了太多的基本问题,但仍然很清楚出了什么问题......

考虑您的输入文档可能基本上如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<table>
  <tr class="calendar_row" data-eventid="12345">
    <td>This IS NOT the tr you're looking for</td>
  </tr>
  <tr class="calendar_row newday singleevent" data-eventid="42064">
    <td>This IS the tr you're looking for</td>
  </tr>
</table>

测试@class="calendar_row"不会与您显示的tr匹配,但会与第一行匹配。

您可以将测试更改为contains(@class,'calendar_row'),但这会匹配两行。 您必须确定某些内容或属性对于您想要的行是唯一的。 也许@data-eventid属性会起作用 - 没有看到整个输入文件就无法判断。