【问题标题】:scraping a web flyer刮网页传单
【发布时间】:2018-03-20 21:37:56
【问题描述】:

我正在抓取网页传单

https://flipp.com/flyers/groceries

POSTAL CODE N2L2A1

然而,尽管所有项目都用 HTML 编码,具有相同的标签和类名,但我无法在 selenium 中抓取所有内容。

我尝试了 find_elements 方法,但仍然只能抓取一个值,从概念上讲不应该是这样。

因为我使用的是通用类名,所以应该列出所有内容。

这里不是这样。我错过了什么吗?

我的代码如下所示:

driver.find_elements_by_xpath("//html/body/flipp-dialog/div/flipp-toast-container/div/flipp-item-dialog/div/h2/span")

【问题讨论】:

  • 我的想法是......看起来每张图片都是一个可点击的标签,所有这些可点击的标签链接都在一个页面中给出,也就是上面的链接。
  • 该链接对我不起作用 - 404 uh oh 意外错误
  • 嗨,马丁,感谢您的尝试。你可以试试这个flipp.com/flyers/groceries

标签: python selenium web-scraping selenium-chromedriver


【解决方案1】:

您选择的 Xpath 有问题。

  1. 通常应避免使用绝对 xpath。而是选择相对 xpath,从对您真正有意义的项目开始。
  2. 确保您选择了页面上实际存在的元素。有时这意味着您需要在该元素可用之前悬停或单击某些内容。例如,当我在您在评论中提供的那个页面上搜索flipp-toast-container 时,它所拥有的只是:

    <flipp-toast-container global=""><flipp-toast></flipp-toast><div class="toastable-content"></div></flipp-toast-container>
    

    所以它不会选择任何有意义的东西。

因此,如果您想选择列出它们的页面上的每个传单名称(例如,flipp.com/flyers/groceries),请像这样使用 xpath:

//flipp-flyer-listing-item//p[@class="flyer-name"]

(即:我们选择flipp-flyer-listing-item,它代表每个传单的容器;并选择带有@class=flyer-name属性的p;我们跳过//之间的任何级别,因为找到这两个项目很重要相对于彼此而言,它们在页面上的位置无关紧要。

如果您的目标是实际抓取每个传单的内容(类似https://flipp.com/flyer/1352064-zehrs-weekly-flyer 的页面),您必须先导航到传单的内容,然后将每个项目选择为:

//flipp-flyerview//a[@class="item-container"]/div

注意:除了 xpath 之外,还有其他方法可以选择项目,我将把导航主题放在一边,因为它不是问题的一部分。

【讨论】:

    【解决方案2】:

    除了定位器更正之外,还要考虑 find_elements...(复数变体)应该返回一个您应该能够迭代的列表。鉴于此,您甚至不必为偏移量出汗太多。

    【讨论】:

      【解决方案3】:

      这里是解析 Flipp 传单的简单方法。在本例中,您的浏览器将返回 application/json 内容类型。

      https://backflipp.wishabi.com/flipp/items/search?locale=[Your Language preference here]&postal_code=[Your postal code here]&q=[Your merchant here]
      
      //in this example you will get all items (description, price, image etc..) from all valid flyers from Walmart in in the area of  H4A1B9 postal code
      
      https://backflipp.wishabi.com/flipp/items/search?locale=en-ca&postal_code=H4A1B9&q=Walmart
      
      //in this example you will search at Walmart for a specifific item
      
      https://backflipp.wishabi.com/flipp/items/search?locale=en-ca&postal_code=H4A1B9&q=Walmart AND milk
      

      //在此示例中,您将在所有商家中搜索特定商品

      https://backflipp.wishabi.com/flipp/items/search?locale=en-ca&postal_code=H4A1B9&q=milk
      

      【讨论】:

      • flipp 在他们的 api 上是否有任何文档,因为我试图通过 upc 代码而不是产品名称进行查询
      • @Chris 你们有没有找到 API 文档?他们似乎没有公开广播他们的 API 端点。
      猜你喜欢
      • 1970-01-01
      • 2018-08-12
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      相关资源
      最近更新 更多