我正在编写一个脚本,以便在Firebase上为一些精选用户进行一些网络爬虫。访问用户的事件页面后,我想检查该用户没有先记录任何事件的条件。
为此,我正在使用Selenium和Python。使用XPath似乎可以很好地在脚本的所有其他部分中定位链接和导航,除了访问表中的元素。起初,尽管我可能使用了错误的Xpath,所以我直接从Chrome的检查窗口复制了路径-仍然没有运气。
作为替代方案,我尝试复制页面源并将其传递给漂亮的汤,然后在此处解析以检查该元素。那里也没有运气。
这是一些代码,以及一些我正在尝试解析的HTML。我要去哪里错了?
# USING WEBDRIVER - ALWAYS TRIGGERS EXCEPTION
def check_if_user_has_any_data():
try:
time.sleep(10)
element = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="event-table"]/div/div/div[2]/mobile-table/md-whiteframe/div[1]/ga-no-data-table/div')))
print(type(element))
if element == True:
print("found empty state by copying xpath directly - bit risky, but it seems to have worked")
else:
print("did'nt find empty state")
except:
print("could not find the empty state element", EC)
# USING BEAUTIFULSOUP
def check_if_user_has_any_data#2():
time.sleep(10)
html = driver.execute_script("return document.documentElement.outerHTML")
soup = BeautifulSoup(html, 'html.parser')
print(soup.text[:500])
print(len(soup.findAll('div', {"class": "table-row-no-data ng-scope"})))
# HTML
<div class="table-row-no-data ng-scope" ng-if="::config" ng-class="{overlay: config.isBuilderOpen()}">
<div class="no-data-content layout-align-center-center layout-row" layout="row" layout-align="center center">
...
</div>
第一个版本触发异常。预期将“元素”评估为“真”。实际,找不到元素。
第二个版本打印前500个字符(据我所知正确地打印),但是返回'0'。检查页面源后,预期返回“ 1”。
答案 0 :(得分:1)
使用以下代码:
elements = driver.find_elements_by_xpath("//*[@id='event-table']/div/div/div[2]/mobile-table/md-whiteframe/div[1]/ga-no-data-table/div")
size = len(elements)
if len(elements) > 0:
#**element is present** do your action
else:
#**element is not present** do alternative action
注意:find_elements不会生成或引发任何异常
答案 1 :(得分:0)
欢迎来到SO。这是我通常使用的方法。
进口
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
方法
def is_element_present(self, how, what):
try:
self.driver.find_element(by=how, value=what)
except NoSuchElementException as e:
return False
return True
答案 2 :(得分:0)
谢谢!
我已经解决了。该页面上有一堆不同的iframe元素,我不知道一个人必须在Selenium中的帧之间切换才能访问这些元素。
初始代码没有问题,建议的解决方案在我测试它们时也可以正常工作。
(对不起,我意识到问题中没有足够的信息来识别此问题)。
这是我用来测试的代码:
# time for page to laod
time.sleep(20)
# Find all iframes
iframes = driver.find_elements_by_tag_name("iframe")
# From inspecting page source, it looks like the index for the relevant iframe is [0]
x = len(iframes)
print("Found ", x, " iFrames") # should return 5
driver.switch_to.frame(iframes[0])
print("switched to frame [0]")
if WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@class="no-data-title ng-binding"]'))):
print("Found it in this frame!")
答案 3 :(得分:0)
有些东西是动态加载的,最好只是在等待异常上设置超时
答案 4 :(得分:0)
如果您使用的是python和硒,则可以使用它。
try:
driver.find_element_by_xpath("<Full XPATH>") #Test the element if exist
<other code>
except:
<run these if element doesn't exist>
答案 5 :(得分:0)
然后检查您使用 if 语句检索的元素的长度, 示例:
element = ('https://www.example.com').
if len(element) > 1:
Do something.