【问题标题】:Class name changes in htmlhtml中的类名更改
【发布时间】:2021-08-29 16:57:15
【问题描述】:

即使我知道该元素始终存在,但我一直在进行网络抓取并不断收到 NoSuchElement 错误(每 2 或 3 次成功尝试一次),它是一个电子商务网站,并且它是其中名称的元素产品已存储。经过长时间的挫折和 100 次失败的解决方案后,我意识到该元素的类名有时会更改,我想知道为什么。html 代码是相同的,只是类名不同。

【问题讨论】:

  • 因为这就是网站程序员决定编写代码的方式。

标签: python html web-scraping web-deployment


【解决方案1】:

有时具有明显相同结构的元素可能会随着网站的更新或网格中某些元素的特定位置而改变。

例如,由于下面的橙色横幅,我假设网格的第一张卡片具有不同的 h2 类,这可能需要与其他类的其他标题不同的填充值。

如果您要查找产品的标题,您可以使用 .card-section-mid h2 之类的名称来识别元素,而无需使用特定的类名。

因此您需要执行以下操作:

title = card.find_element_by_css_selector('.card-section-mid h2')
#card assuming you've already selected the card element

网络抓取的最佳解决方案是寻找 API。

第二好的解决方案是找到能够经受住时间考验或布局可变性的强大选择器。在这种情况下,div.card-section-mid 中包含的第一个 h2 似乎总是包含标题。因此,它是网络抓取目的最喜欢选择的目标。

【讨论】:

  • 有趣的是,卡片的中间部分有时也会改变
  • 是的,这是网络抓取游戏的一部分哈哈。尝试找到性能最佳、最通用的选择器来满足您的需求 :) 例如,即使在每张卡中都找不到.card-section-mid,您可以尝试使用card.find_element_by_css_selector('h2 a')。即使您现在可能有一些不需要的元素。
  • 没有办法了吗?
  • 编辑了我的上一条评论
  • 关闭!它会在 h2 标签下找到第一个 a 标签,这很好,因为 a 标签包含商店商品的标题。因此,即使卡片中有三个 h2 标签,我也会只查看包含 a 标签的那个。和vicvicersa,如果它不是h2标签的孩子,我不会采取任何随机锚链接
猜你喜欢
  • 2021-06-06
  • 1970-01-01
  • 2013-09-13
  • 2017-12-07
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多