【问题标题】:extracting URL from tag从标签中提取 URL
【发布时间】:2013-07-12 01:35:07
【问题描述】:

我希望通过包含该元素的 HTML 请求进行解析:

<img src="https://pbs.twimg.com/media/...." alt="Embedded image permalink"</a>

尝试获取img src 标签。我想要的只是 URL。

在这一点上,我可能太过分了。使用 Request 和 Cheerio 尝试完成此操作。

在我尝试过的 20 种不同方法中,这是我当前的代码。

var dummy;
request('http://t.co/....', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    $ = cheerio.load(response.body);
    dummy = $('img[alt=Embedded image permalink]').attr('html');
    console.dir(dummy);
  }
}

我收到错误消息:

selector = selector.substr(data[0].length);
TypeError: Cannot read property '0' of null

正如我所说,这可能过于复杂了。最简单(或只是实用)的方法是什么?

【问题讨论】:

  • 你为什么不使用一些更琐碎的东西,比如字符串函数和正则表达式?
  • 我肯定把事情复杂化了。从 regex 开始,但我的 regex 技能还达不到标准 - 放弃了它,转而朝这个方向发展。杰里米,试过了,只是得到了未定义的错误?

标签: jquery node.js cheerio


【解决方案1】:

所以,如果我理解正确,您想在一串文本中紧跟src 字符串后减去url

你为什么不把所有的文本都放在一个变量中,然后再拆分它呢?

例如:

    var arrayOfElements = $("#txt").val().split("src=");
    var replacing = arrayOfElements[1].replace(/"/g, "'");
    var url = replacing.split("'");

    //You can now access the element by using url[1]

您可以看到一个工作示例HERE。祝你好运!

【讨论】:

    【解决方案2】:

    使用正则表达式!

    这样的事情应该可以解决问题:

    html.match(/<img [^>]*src="([^"]*)"/g)
    

    在此处查看工作示例:http://www.rubular.com/r/f89Y9fHGtN(注意:Ruby 正则表达式与 JS 正则表达式有点不同,但我不知道后者有这么酷的工具。)

     


    正则表达式解释:

    &lt;img - 这匹配标签的开头。

    [^&gt;]* - 有点棘手。这消除了src 参数(例如alt 参数)前面的内容。当参数中有 &gt; 字符时,此版本失败,这可能不应该发生。您可以尝试将此部分替换为 .*,这在这种情况下会起作用,另一方面,当参数值以 src= 结尾时会失败。

    src=" - 这会找到 src 参数。

    ([^"]*) - 捕获里面的 URL。

    " - 找到值的结尾。

     

    有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

     

    【讨论】:

    • 两种方法更接近!这就是现在的情况。以这个 URL 为例:twitter.com/LindsayBaines/status/355971561175531520/photo/1/… 并通过 rubular 运行 HTML。您将获得页面上的所有图像。我正在尝试将其缩减为 :large 附加到末尾的那个。这就是为什么我试图匹配这个... data-url="pbs.twimg.com/media/BPCqP7ZCQAEe1Pg.png:large" data-resolved-url-large="pbs.twimg.com/media/BPCqP7ZCQAEe1Pg.png:large">
    • 这有帮助吗? html.match(/&lt;img [^&gt;]*src="([^"]*:large)"/g)
    • 为了清楚起见,我只在捕获块中添加了:large 部分。
    • arghhh... 我应该知道的 :) 我在玩表达式的开头。不是结束。我正在努力应对最后一个挑战。我返回 pbs.twimg.com/media/BPCqP7ZCQAEe1Pg.png:large" 以便单独获取“”中的 URL。正在努力。非常感谢休伯特的帮助。感觉就像我在 1997 年左右玩 Perl。
    • Ha: body.match(/https:([^"]*:large)/g); 有效 ---- 除了它还会匹配 :large 之后存在尾随字符的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多