高级 HTML Agility Pack 使用

2024-01-11

我对 HTML Agility Pack 还很陌生,因此我需要一些帮助来了解下一步该做什么。我可以做一些简单的事情,比如从 href 中提取一个值(知道我正在寻找的 url 字符串),并且我可以根据正在使用的特定类来提取跨度中的值。但我不明白如何在有大量标签或标签没有一个真正可靠的锚点的情况下使用 HTML Agility Pack?

这是我正在抓取的实际代码块。我在单元格中放置了虚拟数据来演示我正在寻找的内容。

提取以下内容的最佳方法是什么:

1.) 公司名称?

2.) 电话号码?

3.) 电子邮件地址?

HTML....

<td>
  <!-- Company Info -->
  <table cellpadding="0" cellspacing="0" border="0">
    <tr>
      <td class="black">
        <table cellspacing="1" cellpadding="0" border="0" width="370">
          <tr>
            <th>COMPANY NAME</th>
          </tr>
          <tr>
            <td class="search">
              <table cellpadding="5" cellspacing="0" border="0" width="100%">
                <tr>
                  <td>
                    <table cellpadding="1" cellspacing="0" border="0" width="100%">
                      <tr>
                        <td colspan="2" align="center">Un-needed Links...</td>
                      </tr>
                      <tr>
                        <td align="center" colspan="2"><hr></td>
                      </tr>
                      <tr>
                        <td align="right" nowrap>
                          <b>
                            <font color="FF0000">
                              Contact Person&nbsp;
                              <img src="/images/icon_contact.gif" align="absmiddle">&nbsp;:
                            </font>
                          </b>
                        </td>
                        <td align="left" width="100%">&nbsp;Judy Smith</td>
                      </tr>
                      <tr>
                        <td align="right" nowrap>
                        <b><font color="FF0000">Phone Number&nbsp;<img src="/images/icon_phone.gif" align="absmiddle">&nbsp;:</font></b></td>
                        <td align="left" width="100%">&nbsp;555-555-5555</td>
                      </tr>
                      <tr>
                        <td align="right" nowrap><b><font color="FF0000">E-mail Address&nbsp;<img src="/images/icon_email.gif" align="absmiddle">&nbsp;:</font></b></td>
                        <td align="left" width="100%">&nbsp;<a HREF="mailto:[email protected] /cdn-cgi/l/email-protection">[email protected] /cdn-cgi/l/email-protection</a></td>
                      </tr>
                      <tr>
                        <td align="center" colspan="2"><hr></td>
                      </tr>
                      <tr>
                        <td align="right" nowrap><b><font color="FF0000">Home Office Location&nbsp;<img src="/images/icon_home.gif" align="absmiddle">&nbsp;:</font></b></td>
                        <td align="left" width="100%">&nbsp;ATLANTA, GA</td>
                      </tr>
                      <tr>
                        <td align="right" nowrap><b><font color="FF0000">Home Office Phone&nbsp;<img src="/images/icon_home.gif" align="absmiddle">&nbsp;:</font></b></td>
                        <td align="left" width="100%">&nbsp;555-555-5555</td>
                      </tr>
                      <tr>
                        <td align="right" nowrap><b><font color="FF0000">Home Office Fax&nbsp;<img src="/images/icon_home.gif" align="absmiddle">&nbsp;:</font></b></td>
                        <td align="left" width="100%">&nbsp;666-666-6666</td>
                      </tr>
                      <tr>
                        <td align="center" colspan="2"><hr></td>
                      </tr>
                      <tr>
                        <td align="right" nowrap><b><font color="FF0000">Broker MC Number&nbsp;<img src="/images/icon_number.gif" align="absmiddle">&nbsp;:</font></b></td>
                        <td align="left" width="100%">&nbsp;123456</td>
                      </tr>
                      <tr>
                        <td align="right" nowrap><b><font color="FF0000">Carrier MC Number&nbsp;<img src="/images/icon_number.gif" align="absmiddle">&nbsp;:</font></b></td>
                        <td align="left" width="100%">&nbsp;654321</td>
                      </tr>
                    </table>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
  <br>

  <!-- Starting Point -->
  <table cellpadding="0" cellspacing="0" border="0">
    <tr>
      <td class="black">
        <table cellspacing="1" cellpadding="0" border="0" width="370">
          <tr>
            <th>Starting Point</th>
            <th>Available</th>
          </tr>
          <tr>
            <td class="search" width="270">&nbsp;<b>ABBEVILLE, GA&nbsp;</b></td>
            <td class="search" align="center" width="100"><span style="color: forestgreen">&nbsp;1/5/11&nbsp;</span></td>
          </tr>
        </table>
      </td>
    </tr>

  </table>
  <br>
  <!-- Destination Point -->
  <table cellpadding="0" cellspacing="0" border="0">
    <tr>
      <td class="black">
        <table cellspacing="1" cellpadding="0" border="0" width="370">
          <tr>
            <th>Destination Point</th>
            <th>Direction</th>
          </tr>
          <tr>
            <td class="search" width="270">&nbsp;<b>ATLANTA, GA&nbsp;</b></td>
            <td class="search" align="center" width="100"><span style="color: FF0000">&nbsp;&nbsp;</span></td>
          </tr>
        </table>
      </td>

    </tr>
  </table>
  <br>
  <!-- Truck Details -->
  <table cellpadding="0" cellspacing="0" border="0">
    <tr>
      <td class="black">
        <table cellspacing="1" cellpadding="0" border="0" width="370">
          <tr>
            <th>Truck Details</th>
          </tr>
          <tr>
            <td class="search">
              <table cellpadding="5" cellspacing="0" border="0">
                <tr>
                  <td>
                    <table cellpadding="0" cellspacing="0" border="0">
                      <tr>
                        <td align="right"><b>Date Posted&nbsp;:</b></td>
                        <td align="left">&nbsp;&nbsp;1/5/2011 10:34:48 AM</td>
                      </tr>
                      <tr>
                        <td align="right"><b>Quantity&nbsp;:</b></td>
                        <td align="left">&nbsp;&nbsp;1</td>
                      </tr>
                      <tr>
                        <td align="right"><b>Equipment Type&nbsp;:</b></td>
                        <td align="left">&nbsp;&nbsp;FT</td>
                      </tr>
                      <tr>
                        <td align="right"><b>Load Size&nbsp;:</b></td>
                        <td align="left">&nbsp;&nbsp;Full</td>
                      </tr>
                      <tr>
                        <td align="right" valign="top"><b>Special Information&nbsp;:</b></td>
                        <td align="left">&nbsp;&nbsp;</td>
                      </tr>
                    </table>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
  <br>
</td>

....更多 HTML


好吧,您必须了解 XPATH 才能真正利用 HTML 敏捷包抓取功能 :-) 您可以 Google 上XPATH 示例 https://www.google.com/search?q=XPATH+examples首先。

关注屏幕抓取问题,棘手的部分是选择您认为对您想要获取的信息最具辨别力的 xpath 表达式。大多数时候,解决方案不仅只有一种,而且您必须准备好更新代码以适应目标站点 HTML 的演变。

因此,这是一种权衡,非常简单的表达式有可能匹配不需要的文本的风险,而过于有区别的表达式则不能容忍被抓取的 HTML 中的演变,有可能什么都不匹配的风险。

至于您的具体文本,这是一个很好的现实示例,下面是执行此操作的代码:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(yourText);

string companyName = doc.DocumentNode.SelectSingleNode("/td/table/tr/td/table/tr/th").InnerText;
Console.WriteLine("company name=" + companyName);

// another way
companyName = doc.DocumentNode.SelectSingleNode("//td[@class='black']/table/tr/th").InnerText;
Console.WriteLine("company name=" + companyName);

// a more advanced XPATH expression, means
// "Select a TD tag anywhere in the doc that has a preceding sibling of TD type with a B chid, with a FONT child with inner text starting with 'Phone Number'"
string phoneNumber = doc.DocumentNode.SelectSingleNode("//td[starts-with(preceding-sibling::td/b/font/text(), 'Phone Number')]").InnerText;
Console.WriteLine("phone Number=" + phoneNumber);

// same kind of story but go down the next A tag
string email = doc.DocumentNode.SelectSingleNode("//td[starts-with(preceding-sibling::td/b/font/text(), 'E-mail')]/a").InnerText;
Console.WriteLine("email=" + email);

PS:请注意,HTML Agility Pack 始终期望 XPATH 表达式中使用的标签为小写,即使它们不在原始 HTML 文本中。

如您所见,此处使用两种不同的表达式检索公司名称。它们都适用于示例,但如果在中间的任何位置添加新标签,第一个将不会抵抗。第二个更面向未来,但基于 CSS 类标签,该标签也可能会发生变化。这总是一个权衡。

电话号码和电子邮件很相似,但显示了 XPATH 的强大功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高级 HTML Agility Pack 使用 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • 为什么 Chrome 和 FireFox 控制台打印“未定义”?

    获取这个简单的测试对象并将其粘贴到控制台中 你会看到它说undefined 该对象正在工作 因为它还打印123 但是什么是undefined about Test var Test new function return get testi
  • 如何使用选择参数从 android 中的 contentprovider 查询特定行

    我已经构建了一个基本的内容提供程序 用于存储用于学习目的的 SMS 消息 到目前为止我可以读取 无需选择参数 插入 更新和删除 然而 我一直在尝试弄清楚如何格式化我的提供程序中 WHERE 子句的选择参数 基本上我的应用程序需要搜索特定的时
  • 如何隐藏 SWT 组合以使其不占用空间?

    我需要隐藏一个组合 以及里面的所有孩子 只需设置setVisible false 将保留组合的空间 Composite outer new Composite parent SWT NONE outer setLayout new Grid
  • 如何在mp3上实现seek

    我即将进入一个涉及解码 播放 mp3 流的项目 我有一个Java解码器 JLayer 但据我所知它没有搜索功能 我不使用内置播放器 我需要实现我自己的播放器 另外 流是加密的 所以我需要实时解密 解码 不能拥有整个解密文件 那么如何在 mp
  • 我们可以为“Skype for Business”构建 Skype 机器人吗?

    我见过与 Skype 一起使用的机器人编程示例 是否可以使用 Microsoft 的机器人 认知服务工具 框架开发在 Skype for Business 上运行的企业机器人 Skype for Business 尚不支持机器人框架 htt
  • 使用Python对文件夹中的每个文件执行命令

    我正在尝试创建一个Python脚本来 查看文件夹 input 对于该文件夹中的每个视频 运行 mencoder 命令 将它们转码为可在我的手机上播放的内容 mencoder 完成运行后 删除原始视频 这看起来不太难 但我很喜欢 python
  • 当这个通用约束看起来有循环引用时,为什么它会编译

    我在 csharp 中为 MVCContrib Html 帮助器编写了一个扩展方法 并对通用约束的形式感到惊讶 从表面上看 它似乎通过类型参数循环引用自身 也就是说 该方法可以根据需要进行编译和工作 我很乐意有人解释为什么这样做有效 以及是
  • Windows 10 UWP 中的电话

    目前 我找到了 Windows ApplicationModel Calls API 无法拨打电话或启动可用于从我的应用程序拨打电话的不同选项 我也尝试了这个代码 但仍然无法实现电话呼叫功能 UWP有什么解决方案吗 谢谢 if ApiInf
  • 两个 div 中的段落对齐方式,中间有图像

    我怎样才能对齐我的段落 如下图所示 我需要展示一份报纸之类的东西 其中应该包含此内容 以下是我正在使用的html代码 div class left div div class right div div class myImage img
  • PHP 中的字符串解析

    我正在尝试用 PHP 解析一个字符串 father name John father weight 44 50 kid gt name Marko gt age 12 kid gt name Sevda gt age 17 kid gt n
  • 如何在R中将槽的默认值设置为NULL?

    我是 R 新手 我试图定义一个类似于树节点的类 也就是说 它有一个左节点和右节点 它应该与父节点属于同一类 所以我将类定义如下 setClass Node representation left Node right Node 我想通过设置
  • Python - 服务器从两个 UDP 套接字监听

    我是 Python 新手 而且我无法让服务器同时监听两个端口 这是我到目前为止编写的代码 sock client1 socket socket socket AF INET Internet socket SOCK DGRAM UDP so
  • 如何用Xcode修改并行编译数量

    使用 XCode 构建 C 项目时如何更改并行编译的数量 我不是在谈论分布式构建 而是在一台计算机上同时编译来自单个项目的一组源文件 当前使用Xcode 3 2 4 Thanks 对于 Xcode 4 您必须设置 IDEBuildOpera
  • 通过 ReactJS 访问 JSON 中的数组

    我使用 ReactJS 从 JSON 文件获取数据
  • 如何在 pygame 中从图像中剪切圆形(或任何非矩形)?

    我正在使用 Pygame 并有一个图像 我可以从中剪出一个矩形 image pygame transform scale pygame image load example png 32 32 handle surface image co
  • 使用onDraw扩展android按钮

    我想更改按钮形状但我想使用 onDaw 方法和扩展按钮班级 所以我刚开始做的是
  • 如何在QT中访问父控件指针

    我有一个类似这样的代码 Window Window QStackedWidget centralApp new QStackedWidget QWidget1 wgt1 QWidget1 QWidget2 wgt2 QWidget2 QWi
  • 添加片段时从汉堡包到箭头图标的过渡动画

    我已经实现了主 细节流程 我想在添加片段后获得从汉堡包图标到箭头图标的过渡动画 与打开导航抽屉时的动画相同 我正在使用如下代码 protected void onCreate Bundle savedInstanceState super
  • BigQuery - 如何比较“日期”列(使用旧版 SQL)?

    我有一个包含一列的 BigQuery 表Date这是一个date类型 我正在尝试运行此查询 SELECT FROM dataset table name WHERE Date 2016 07 11 这会引发错误 Argument type
  • 高级 HTML Agility Pack 使用

    我对 HTML Agility Pack 还很陌生 因此我需要一些帮助来了解下一步该做什么 我可以做一些简单的事情 比如从 href 中提取一个值 知道我正在寻找的 url 字符串 并且我可以根据正在使用的特定类来提取跨度中的值 但我不明白