我正在抓取网络传单
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")
请您参考如下方法:
您选择的 Xpath 有问题。
- 通常您应该避免使用绝对 xpath。选择相对 xpath,从对您实际有意义的项目开始。
确保您选择的元素实际存在于页面上。有时这意味着您需要悬停或单击某个元素,然后该元素才可用。例如,当我在您在评论中提供的那个页面上搜索
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- 的 ;我们使用 p name// 跳过中间的任何级别,因为重要的是找到彼此相关的这 2 个项目,它们在页面上的位置无关紧要。
如果您的目标是实际抓取每个传单的内容(页面如 https://flipp.com/flyer/1352064-zehrs-weekly-flyer ),您必须先导航到传单的内容,然后选择每个项目:
//flipp-flyerview//a[@class="item-container"]/div
注意:除了 xpath 之外,还有其他方法可以选择项目,我将导航主题放在一边,因为它不是问题的一部分。
