我在抓取有很多子元素的网站方面有点缺乏经验,我正试图理解循环遍历元素的最佳方法,这些元素有你想要在子元素的更深层次中隐藏的数据。
下面是一个HTML
示例<div class="s-item__info clearfix">
<h3 class="s-item__title">The Music Tree Activities Book: Part 1 (Music Tree (Summy)) by Clark, Frances, </h3>
</a>
<div class="s-item__subtitle"><span class="SECONDARY_INFO">Pre-Owned</span></div>
<div class="s-item__reviews">
</div>
<div class="s-item__details clearfix">
<div class="s-item__detail s-item__detail--primary"><span class="s-item__price">$3.99</span></div>
<span class="s-item__detail s-item__detail--secondary">
</span>
<div class="s-item__detail s-item__detail--primary"><span class="s-item__purchase-options-with-icon" aria-label="">Buy It Now</span></div>
<div class="s-item__detail s-item__detail--primary"><span class="s-item__shipping s-item__logisticsCost">Free shipping</span></div>
<div class="s-item__detail s-item__detail--primary"><span class="s-item__free-returns s-item__freeReturnsNoFee">Free returns</span></div>
<div class="s-item__detail s-item__detail--primary"></div>
</div>
</div>
有多个项目,所以我首先在一个列表中获取所有项目,我可以通过迭代找到每个标题,但在获取价格时遇到了问题。示例代码
for item in driver.find_elements_by_class_name("s-item__info"):
title = item.find_element_by_xpath('.//h3')
print(title.text)
details = item.find_element_by_xpath('.//span[@class="s-item__price"]')
print(details.text)
获取商品的Title,但找不到价格。如果我从s-item_info"元素,只是使用驱动程序,我可以得到所有的价格与下面的代码,但想知道为什么它不能在info元素中找到它,我认为细节将是一个子元素和。//将通过这些。
driver.find_elements_by_class_name("s-item__price")
Have also tried
find_element_by_xpath('.//div[@class="s-item__detail"]//span[@class="s-item__price"]')
我可以获取我需要的数据,但我想了解为什么当我尝试遍历每个项目时,我无法获得价格。由于
查看是否有效
for item in driver.find_elements_by_class_name("s-item__info"):
title = item.find_element_by_xpath('.//h3')
print(title.text)
details = item.find_element_by_xpath('.//following::div[contains(@class,'s-item__details')]//span[@class='s-item__price']')
print(details.text)
好的,这里有几个问题:
-
s-item__info
不是该元素上唯一的类名,您应该使用//div[contains(@class,'s-item__info')]
而不是 -
第一个匹配类名的元素不是有效的搜索结果。
让你的代码工作的简单方法是:
for item in driver.find_elements_by_xpath("//div[contains(@class,'s-item__info')]"):
title = item.find_elements_by_xpath('.//h3')
if(title):
print(title[0].text)
details = item.find_elements_by_xpath('.//span[@class="s-item__price"]')
if(details):
print(details[0].text)
如果存在则打印数据,否则只打印空字符串