我正在try 在Apps脚本中创建一个简单的eBay价格刮擦函数,用于Google Sheet:

// This code produces a null result (not correct)
function GetEbayPriceByISBN(isbn = 9780765377135)
{
    const ebayUrl = 'https://www.ebay.com/sch/i.html?_nkw=' + isbn + '&_sacat=0&LH_TitleDesc=0&_odkw=' + isbn + '&LH_Complete=1&LH_Sold=1'
    let response = UrlFetchApp.fetch(ebayUrl)
    let htmlStr = response.getContentText()

    const priceSpan = /<span class="s-item__price"><!--F#f_0--><!--F#f_0--><span class="POSITIVE">([\s\S]*?)<!--F\/--><!--F\/--><\/span>/gm;
    let allPrices = htmlStr.match(priceSpan)

    console.log(allPrices)

    return allPrices;
}

上面的正则表达式是我能想出的最好的方法来获取我需要的准确数据.它完美地工作在here%,但当我运行代码时,它是fails.在与整个HTML文件进行匹配时,我得到的结果是从xmlStr.match(priceSpan)开始为NULL,而实际上它应该给出该范围内出现的所有事件的列表.

但是,在对较小的HTML文件片段进行测试时,我确实得到了correct的结果:

// This code WORKS
function GetEbayPriceByISBN2(isbn = 9780765377135)
{
    const testText = `</span><span class="clipped"> - Mistborn: The Final Empire - Paperback By Sanderson, Brandon - VERY GOOD</span></span></a></div><div class="s-item__details clearfix"><div class="s-item__detail s-item__detail--primary"><span class="s-item__price"><!--F#f_0--><!--F#f_0--><span class="POSITIVE">$5.00</span><!--F/--><!--F/--></span></div><span class="s-item__detail s-item__detail--secondary"><span class="s-item__seller-info"><span class="s-item__seller-info-text">gilsdorf (48) 100%</span></span></span>`

    const priceSpan = /<span class="s-item__price"><!--F#f_0--><!--F#f_0--><span class="POSITIVE">([\s\S]*?)<!--F\/--><!--F\/--><\/span>/gm;
    let allPrices = testText.match(priceSpan)

    console.log(allPrices)

    return allPrices;
}

所以我不认为regex有什么问题.我对Apps脚本和网页解析的了解很少,所以我可能做了完全错误的事情.

有什么好主意吗?谢谢.

Note:我试过使用更简单的正则表达式s-item__price和这个does work(它可以找到‘S-ITEM__PRICE’的所有实例),但是一旦我向我的正则表达式添加报价(不管是否转义),它就失败了.

推荐答案

修改要点:

当我使用脚本中的URL判断HTML时,我注意到检索到的HTML如下所示.

<span class=s-item__price><!--F#f_0--><!--F#f_0--><span class=POSITIVE>$29.95</span><!--F/--><!--F/--></span>

似乎s-item__pricePOSITIVE不是被"包围的.但是,在您的脚本中,使用了以下正则表达式.

<span class="s-item__price"><!--F#f_0--><!--F#f_0--><span class="POSITIVE">([\s\S]*?)<!--F\/--><!--F\/--><\/span>

在这种情况下,无法检索上述值.我想这可能是你现在这个问题的原因.当这反映在您的脚本中时,下面的修改如何?

修改后的脚本:

function GetEbayPriceByISBN(isbn = 9780765377135) {
  const ebayUrl = 'https://www.ebay.com/sch/i.html?_nkw=' + isbn + '&_sacat=0&LH_TitleDesc=0&_odkw=' + isbn + '&LH_Complete=1&LH_Sold=1';
  let response = UrlFetchApp.fetch(ebayUrl);
  let htmlStr = response.getContentText();

  const priceSpan = /<span class=s-item__price><!--F#f_0--><!--F#f_0--><span class=POSITIVE>([\s\S]*?)<!--F\/--><!--F\/--><\/span>/gm; // Modified

  let allPrices = htmlStr.match(priceSpan);
  console.log(allPrices);
  return allPrices;
}
  • 当运行这个修改后的脚本时,将获得以下结果.

    [
      "<span class=s-item__price><!--F#f_0--><!--F#f_0--><span class=POSITIVE>$29.95</span><!--F/--><!--F/--></span>",
      "<span class=s-item__price><!--F#f_0--><!--F#f_0--><span class=POSITIVE>$5.22</span><!--F/--><!--F/--></span>",
      "<span class=s-item__price><!--F#f_0--><!--F#f_0--><span class=POSITIVE>$13.22</span><!--F/--><!--F/--></span>",
      "<span class=s-item__price><!--F#f_0--><!--F#f_0--><span class=POSITIVE>$7.69</span><!--F/--><!--F/--></span>",
      "<span class=s-item__price><!--F#f_0--><!--F#f_0--><span class=POSITIVE>$5.00</span><!--F/--><!--F/--></span>"
    ]
    
  • 例如,如果还有一个图案,s-item__pricePOSITIVE"括起来,那么下面的修改如何?

    • 从…

        const priceSpan = /<span class=s-item__price><!--F#f_0--><!--F#f_0--><span class=POSITIVE>([\s\S]*?)<!--F\/--><!--F\/--><\/span>/gm;
      
    •   const priceSpan = /<span class="?s-item__price"?><!--F#f_0--><!--F#f_0--><span class="?POSITIVE"?>([\s\S]*?)<!--F\/--><!--F\/--><\/span>/gm;
      

Html相关问答推荐

如何在两个弹性项目之间添加边框?

网格容器中的定心元件

在浮动元素旁边垂直居中

为什么在CSS中字段是一个有效的 colored颜色 名称?

将网格包装在css中

为什么在移动视图中,这个水平可滚动的表格会在表格的右侧显示额外的空间?

如何突破安莉得分

SVG';COLOR&39;属性不优先于通用css';COLOR&39;属性

HX-POST未使用正确的操作(路径)

HTML 邮箱在 Gmail 中无法正确显示

如果使用复选框属性更改,如何防止事件更改?

停止 Bootstrap 5 输入调整 CSS 网格单元的高度

并排放置两个 div,同时 div2 环绕 div1

SVG 填充 colored颜色 不使用轮廓填充空白区域

动态计算高度时 Div 不保持 1/1 纵横比

如何在没有容器的情况下沿基线将 div 中的元素居中?

如何使用 CSS Flex 设计一个导航栏,其中一组项目左对齐而另一组项目右对齐?

圆形边框显示在该部分后面.怎么修?

两个按钮范围滑块的 CSS

如何阻止网格项目拉伸?