屏幕抓取:正则表达式还是 XQuery 表达式?

2024-04-06

我正在回答一些面试的测验问题,问题是关于我如何进行屏幕抓取。也就是说,假设您没有更好的结构化方法来直接查询信息(例如网络服务),则从网页中挑选内容。

我的解决方案是使用XQuery表达。该表达式相当长,因为我需要的内容在 HTML 层次结构中相当深。在我找到一个带有id属性。例如,抓取 Amazon.com 页面的产品尺寸如下所示:

//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()

这是一个相当令人讨厌的表达方式,但这就是亚马逊提供 Web 服务 API 的原因。无论如何,这只是一个例子。问题不是关于亚马逊,而是关于屏幕抓取。

面试官不喜欢我的解决方案。他认为它很脆弱,因为 Amazon 对页面设计的更改可能需要重写 XQuery 表达式。调试与所应用的页面中的任何内容都不匹配的 XQuery 表达式是很困难的。

我并不反对他的说法,但我不认为他的解决方案有任何改进:他认为最好使用正则表达式,并搜索运输重量附近的内容和标记。例如,使用 Perl:

$html =~ m{<li>\s*<b>\s*Product Dimensions:\s*</b>\s*(.*?)</li>}s;

我的反驳是,这也容易受到亚马逊更改其 HTML 代码的影响。他们可以用大写字母拼写 HTML 标签(<LI>),或者添加 CSS 属性或更改<b> to <span>或者将标签“产品尺寸:”更改为“尺寸:”或许多其他类型的更改。我的观点是,正则表达式并不能解决他在我的 XQuery 解决方案中指出的弱点。

但此外,正则表达式可能会发现误报,除非您向表达式添加足够的上下文。它还可能无意中匹配注释、属性字符串或 CDATA 部分中的内容。

我的问题是,你们使用什么技术来进行屏幕抓取?您为什么选择该解决方案?有什么令人信服的理由来使用它吗?或者从不使用另一个?除了我上面展示的之外,还有第三种选择吗?

PS:为了论证,假设没有 Web 服务 API 或其他更直接的方式来获取所需的内容。


我会使用正则表达式,但这只是因为大多数 HTML 页面都不是有效的 XML,因此您永远无法让 XQUERY 工作。

我不知道 XQuery,但对我来说这看起来像是一个 XPATH 表达式。如果是这样,里面有这么多“//”运算符,看起来有点贵。

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

屏幕抓取:正则表达式还是 XQuery 表达式? 的相关文章

  • sed:更改 .yml 文件中环境属性的值

    我有一个 yml 文件 用于配置应用程序的环境属性 如下所示 env1 prop1 value1 prop2 value2 propn valuen env2 prop1 value1 prop2 value2 prop3 value3 p
  • Python:如何删除圆括号内的文本?

    我试过了 但没用 return re sub myResultStats text 建议 thanks 尝试这个 return re sub myResultStats text 括号表示捕获组 因此您必须转义它们
  • 独立于符号的字符串的模式匹配

    我需要一种算法 可以在数据中找到预定义的模式 以字符串的形式存在 独立于数据和模式的实际符号 字符 我只关心符号之间的关系 而不关心符号本身 数据中的同一符号具有不同的模式符号也是合法的 模式匹配算法必须强制执行的唯一一件事是保留模式中同一
  • java regex,仅当不在引号或括号中时才以逗号分隔

    我想通过正则表达式进行java split 当字符串不在单引号或括号中时 我想在每个逗号上分割字符串 例子 Hello my friend how are you should give hello my friend how are yo
  • 如何使用 ng-pattern 验证 angularJs 中的电子邮件 ID

    我正在尝试使用 ng pattern 指令验证 angularJs 中的电子邮件 id 字段 但我是 AngularJs 的新手 我需要在用户输入错误的电子邮件 ID 后立即显示错误消息 我下面的代码正在尝试解决 帮助我使用 ng patt
  • Google App Engine 密钥中允许使用哪些字符?

    在测试我的 Google App Engine 应用程序时 我搜索包含应用程序引擎密钥的链接 例如 story ag5yZXBsaWUtdGVzdGluZ3IMCxIFU3RvcnkY w0M 这些键中允许使用哪些字符 我一直在使用正则表达
  • 设置正则表达式中的最小和最大字符

    我写了一个正则表达式 http en wikipedia org wiki Regular expression匹配任意数量的字母 字母之间有任意数量的单个空格 我希望该正则表达式也强制执行最小和最大字符数 但我不确定如何做到这一点 或者是
  • 根据多个分隔符拆分字符串

    我试图通过引用根据多个分隔符分割字符串jquery中如何用多个字符串作为分隔符分割一个字符串 https stackoverflow com questions 13867182 how split a string in jquery w
  • 使用 Javascript 从 URL 字符串获取端口 [重复]

    这个问题在这里已经有答案了 我想要一个 javascript 函数 它将获取一个 url 作为参数 并返回该 URL 的端口 如下所示 如果有一个http or https 端口 80 443 它不会显示在 url 结构中 但我还是希望它们
  • 如果字符串中的第一个字符是逗号,则删除它

    我需要在 javascript 中设置一个函数来删除字符串的第一个字符 但前提是它是逗号 我找到了substr函数 但这将删除任何内容 无论它是什么 我当前的代码是 text value newvalue substr 1 text val
  • Perl 字符串替换:匹配但不替换正则表达式的一部分

    假设我在 Perl 中有一个字符串 我正在尝试匹配并替换为以下内容 string s a zA Z find a zA Z replace g 如图所示 我想替换两侧被非字母字符包围的所有内容 但是 当我替换字符串时 我不想也替换这些字符
  • 如何确定输入的模式是“Int,VarChar,Date,Time ...”等

    我有一个下拉菜单 其中包含DataType 和一个文本框 这是用于输入的Regex Pattern 如果我进入 test 在文本框中 或从下拉菜单中选择Int 如果在文本框中输入 则其模式是错误的 0 9 那么它的correct patte
  • php 中是否可以使用正则表达式替换短语后面的单词?

    输入文本 工程学院 医学院 所需产出 教育学院 教育学院 规则 school of 后面的任何单词都需要替换为 education inputext school of engineering school of medicine rule
  • 用于匹配 Apache 虚拟主机文件中的特定值的正则表达式

    我想匹配定义为的值ServerName ServerAlias and DocumentRoot用正则表达式 任何带有前缀的内容 可以忽略 我还想将每个虚拟主机的定义分开 因此在下面的示例中我有两个数组 Example
  • 正则表达式 - PHP Lookaround

    我有一个字符串 例如 foo Hello How are you I am very good thank you 我知道这是一个奇怪的字符串 但请留在我身边 P 我需要一个正则表达式来查找 在此处查找内容 之间的内容 并将其放入数组中 即
  • htaccess 正则表达式目录到变量

    我需要对某些 URL 从目录到变量进行 301 重定向 EXAMPLE http domain com es stackoverflow gt http domain com stackoverflow lang es http domai
  • 使用特殊字符创建正则表达式

    我正在为 mongodb 创建一个查询 app get content title function req res var regexp new RegExp req params title i db find title regexp
  • Javascript RegEx 替换所有不在 HTML 标签内的字符

    寻求一些帮助 我的正则表达式有点生锈 我试图用一个字符替换 javascript 中 HTML 标签之外的所有字符 例如 用破折号 替换这些字符 div class test Lorem Ipsum br Dolor Sit Amet di
  • 正则表达式的替代(流畅?)界面设计

    我刚刚看到了一个巨大的 Java 正则表达式 这让我对正则表达式的一般可维护性进行了一些思考 我相信大多数人 除了一些糟糕的 Perl 贩子 都会同意正则表达式很难维护 我正在考虑如何解决这种情况 到目前为止 我最有希望的想法是使用流畅的界
  • regex php - 查找 div 中具有特定 ID 的内容

    我确信这是一个简单的问题 尽管我在谷歌上进行了如此多的搜索和搜索 但我似乎无法弄清楚这有什么问题 我在此页面上的其他区域使用类似的表达式来准确返回我想要的内容 但是 我无法让这个特定的位返回我想要的东西 所以也许有人可以帮助我 我有一个带有

随机推荐

  • 自定义 highcharts 工具提示以显示日期时间

    我正在开发一个项目 预计会显示此图 http jsfiddle net Kc23N http jsfiddle net Kc23N 当我单击一个点 工具提示 时 我想显示一个可以理解的日期 而不是以毫秒为单位的值 我认为需要更改这段代码 t
  • 如何以编程方式创建 UIImage 视图 - Swift

    我正在尝试以编程方式创建 UIImage 视图 我有一个新视图 我尝试这样做 let imageName yourImage png yourview backgroundColor UIColor colorWithPatternImag
  • 重叠数据标签折线图高图

    How i can solve the problem of the values dataLabels below 我的 JSFiddle http jsfiddle net 3kVJS 3 http jsfiddle net 3kVJS
  • 如何在 C# Core Console 应用程序中使用 MemoryCache?

    我想在 NET Core 2 0 控制台应用程序中使用 Microsoft Extensions Caching Memory MemoryCache 实际上 在控制台或 asp net 应用程序中使用的库中 我创建了一个测试应用程序 us
  • OpenID,如何开发提供商

    目前我正在开发一些基础设施 并且已经实现了自己的 RESTful 身份验证机制 现在我想也许我不应该走这条路并使用行业标准 因此与我的项目的互操作性在身份验证和授权方面可能很琐碎并且更容易理解 查了一些文章后googling在 Stacko
  • 如何通过 QTest 访问 QMessageBox

    我正在创建一些自动化的图形用户界面测试在我的应用程序中使用QTest 我可以使用以下命令从我的应用程序访问小部件 savePushButton mainWindow gt findChild
  • Ajax + q翻译

    嗨 我遇到了同样的问题里克曾在这里 https stackoverflow com questions 7571643 qtranslate plugin and ajax requests rq 1 给出的答案是他必须 在代码中搜索链接请
  • python 中处理 Excel 文件的最佳库是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个很大的Excel 里面有很多工作表和工作表内相互链接的公式 我需要使用代码在一张纸中填充输入 并
  • NSTableView 排序

    我在 NSTableView 中有两列作为名称和薪水 有 5 10 个值 我想在单击两个列的标题后对这些列进行排序 互联网上有很多数据 但我无法使用这些数据 请帮我在可可中做到这一点 预先感谢并感谢任何帮助 每个表列都有一个方法setSor
  • 由 Javascript 填充的 QML ListView

    我刚刚意识到 根据一些 QML Bugreport ListView 缺少 JSON Delegate 所以我有两个选择 通过用Javascript或C 创建的模型来填充它 特别是我需要从预定义的 URL 下载 json 数据并将它们解析到
  • 如何在高图表中放置自定义标签

    我正在尝试执行官方 HighCharts 小提琴中的操作 http jsfiddle net gh get library pure highcharts highcharts tree master samples highcharts
  • 在 UISearchBar 中自动显示文本光标

    是否可以始终在 UISearchBar 中显示文本光标 不仅在触摸后 add this void viewDidAppear BOOL animated mySearchBar becomeFirstResponder super view
  • 正则表达式解析货币价值

    我需要在 AS3 中编写一个 RegExp 它将 Excel 格式的货币值解析为数字 例如 正则表达式 35 600 00 35600 并检查其格式是否正确 使用 作为千位分隔符 作为小数点 货币符号可以是任何符号 不仅仅是 并且可以位于开
  • 使用 IP 地址而不是域名发送电子邮件

    我试图避免通过 DNS 服务器将电子邮件发送到我托管的虚拟帐户之一上的地址 我知道我可以用方括号将 IP 地址括起来 但如何为服务器上的 虚拟 托管帐户指定邮箱用户名 换句话说 我在虚拟服务器上托管了多个域 所有域共享相同的 IP 地址 明
  • 如何更改列表框中单词的颜色

    我制作了一个带有文本框的表单 它接受一个单词并搜索一堆句子以查看其中是否有任何一个包含该单词 之后我必须显示这些句子并突出显示该单词 我的计划是制作一个列表框并添加里面的句子 我的问题是如何突出显示该单词 我想是通过更改颜色 以便可以区分它
  • Rubocop 仅检查修改的行

    我想在终端上仅针对我在 git 版本化项目中修改的行运行 rubocop 目前 通过谷歌搜索 我看到了适用于整个修改文件的脚本 I found this https gist github com skanev 9d4bec97d5a682
  • Google 网络字体与实际字体文件 - 适用于所有设备

    我正在寻找使用 Josefin Sans 它已列在 Google 网络字体中 我还有 eot svg ttf 和 woff 这意味着与文件完全兼容 据我所知 我的主要问题是 哪个更好 Google 字体加载速度更快吗 是不是更加兼容呢 或者
  • 在 Go 函数中返回本地数组的切片安全吗?

    如果我返回作为函数或方法的局部变量的数组切片 会发生什么情况 Go 是否将数组数据复制到创建的切片中make 容量与切片大小或数组大小匹配吗 func foo uint64 var tmp 100 uint64 end 0 for tmp
  • 无法使用可选参数推断泛型类型

    给定以下方法签名 为什么当显式命名参数时编译器无法自动推断类型 Visual Studio 2010 SP1 能够推断类型并且不会显示任何警告或错误 IEnumerable
  • 屏幕抓取:正则表达式还是 XQuery 表达式?

    我正在回答一些面试的测验问题 问题是关于我如何进行屏幕抓取 也就是说 假设您没有更好的结构化方法来直接查询信息 例如网络服务 则从网页中挑选内容 我的解决方案是使用XQuery表达 该表达式相当长 因为我需要的内容在 HTML 层次结构中相