首页 > 解决方案 > 正则表达式,仅获取带有以美元符号开头的项目的图像 URL

问题描述

所以,我知道这听起来有点奇怪,但基本上这是我的 HTML 示例:

$400 + free shipping</title>
   <link>https://www.dealnews.com/Samsung-50-4-K-HDR-LED-Smart-TV-for-400-free-shipping/17336849.html?iref=rss-dealnews-editors-choice</link>
   <description>&lt;img src='http://c.dlnws.com/image/upload/f_auto,t_large,q_auto/content/vdiy8a75wg8v7bo92dhq'

我只想捕获在它之前具有美元符号方式的项目的 URL,例如 $.... 之后的所有内容,而不是 (URL) 目前我的正则表达式是这样的:

img src='([^']+)'.*

这会抓取每个 img src,但是我只希望像我之前所说的那样,前面有“$”符号的图像,基本上我不想要任何与此 HTML 页面上的产品无关的图像。

标签: pythonhtmlregex

解决方案


查看您提供的 HTML 示例,您的产品图像似乎直接在<description>HTML 标记之前。直接在所需 URL 之前使用非捕获组而不是一路回溯到潜在的(但未授予)$ 符号所需的处理能力(和时间)更少。如果您将<description>标签专门用于产品,则此正则表达式将满足您的需求: (?:<description>&lt;img src=')([^']+)

其他需要考虑的事项:

  • 如果您需要检查 HTML 代码中的多行,请确保添加 Global 和 Multiline 修饰符。
  • 如果您需要考虑 HTML 实体并允许将 HTML 实体与已解析的 HTML 组合在一起,请考虑创建一个 OR 语句以允许它们在您的 Regex 中使用。例如,允许在标签之前<&lt;之前img使用: (?:<description>(?:&lt;|<)img src=')([^']+)如果我们同时考虑到描述标签的打开和关闭实体,我们最终会得到:(?:(?:&lt;|<)description(?:&gt;|>)(?:&lt;|<)img src=')([^']+)

推荐阅读