【发布时间】:2021-02-28 16:45:31
【问题描述】:
我有一个包含以下 40 个 div 的 HTML 页面
<div class='movie-featured'>
<div class="item analytics">
<div class="movie-details">
<div class="movie-rating-wrapper">
<span class="movie-rating-summary">
<span>some text</span>
</span>
</div>
</div>
</div>
</div>
我正在尝试通过find_element_by_css_selector('span.moview-rating-summary').find_element_by_tag_name('span').text在 40 个 div 中的每一个中获取此范围内的文本 <span>some text</span> rom:find_element_by_css_selector('span.moview-rating-summary').find_element_by_tag_name('span').text
输出:
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '6/10', '', '', '', '', '', '', '', '', '7.5/10', '', '', '', '', '']
如您所见,我只从几个跨度中获取文本,而不是全部。
我也试过了:find_element_by_tag_name('span').get_attribute('textContent') 和 find_element_by_tag_name('span').get_attribute('innerHTML')。
但结果还是一样
有什么办法解决这个问题吗?
代码试验:
from selenium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
browser = webdriver.Chrome()
delay = 10
browser.get("www.example.com")
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(2)
images =[]
myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.CLASS_NAME, 'item-responsive')))
body = browser.find_element_by_class_name('movie-featured') # body of images container
imageItems = body.find_elements_by_css_selector('div.item.analytics') #list of divs that hold movies images
for item in imageItems:
rate = item.find_element_by_css_selector('span.moview-rating-summary').text
images.append(rate)
print(images)
browser.close()
感谢你们提供的所有帮助。 我通过如下更改代码解决了这个问题:
body = browser.find_element_by_class_name('movie-featured')
rateDivs = body.find_elements_by_xpath('//div[@class="moview-rating-wrapper"]')
ratelist = []
for div in rateDivs:
span = div.find_element_by_css_selector('span.moview-rating-summary')
ratespan = span.find_element_by_tag_name('span')
rate = ratespan.text
if len(rate) > 0:
ratelist.append(rate)
else:
continue
print(ratelist)
browser.close()
非常感谢您为帮助我所花费的所有时间。
【问题讨论】:
-
第一个问题好!继续发帖!
-
你能分享你正在使用的网址吗? - 我认为有一种更有效的方法使用 find_elements_ 在没有循环的情况下获得你想要的东西,但如果想在我发布答案之前对其进行测试
-
@RichEdwards 我使用的网址是我所在国家/地区的 ISP 专用的,在国外无法使用
-
感觉你的标识符中有一些东西没有按预期工作。你知道如何使用 devtools 来查看所有匹配项吗?
-
打开 devtools (F12),转到元素选项卡,按 crtl+f,然后输入您的 xpath 或 css。您的标识符匹配的所有内容都是您将使用 find_elements 返回的内容 - 查看这些内容并确保它们都具有您期望的文本... legend42 的 xpath 几乎就是我将使用的内容,因此将其放入并查看是否所有跨度都有文本.... 如果您确定您的跨度有文本,那么请考虑它们是否都需要滚动到视图中才能“存在”。
标签: python selenium xpath css-selectors webdriverwait