我在中编写了一个脚本,为一些选定的用户在我的Firebase上进行一些webscraping。在访问某个用户的事件页面后,我想首先检查该用户是否没有记录任何事件。
为此,我使用了Selenium和Python。使用XPath似乎可以在脚本的所有其他部分找到链接和导航,除了访问表中的元素。起初,我想我可能使用了错误的XPath表达式,所以我直接从Chrome的检查窗口复制了路径,但仍然没有成功。
作为一种替代方法,我尝试复制页面源代码并将其传递到Beautiful Soup,然后在那里解析它以检查元素。
下面是一些代码,以及我正在尝试解析的一些HTML。我哪里出错了?
# Using WebDriver - always triggers an 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 expression directly. It is a bit risky, but it seems to have worked")
else:
print("didn’t find empty state")
except:
print("could not find the empty state element", EC)
# Using Beautiful Soup
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>
第一个版本会触发例外状况,而且预期会将'element'评估为True。实际上,找不到项目。
第二个版本打印了前500个字符(据我所知是正确的),但它返回了“0”。在检查页面源代码后,它应该返回“1”。
6条答案
按热度按时间ccgok5k51#
请使用下列程式码:
注意:find_elements 不会生成或抛出任何异常
kkbh8khc2#
下面是我通常使用的方法。
进口
检查方法
wpx232ag3#
有些东西是动态加载的,最好在等待异常时设置一个超时。
ruarlubt4#
如果你正在使用Python和Selenium,你可以使用以下代码:
k7fdbhmy5#
我已经解决了这个问题。这个页面有很多不同的iframe元素,我不知道在Selenium中访问这些元素需要在框架之间切换。
初始代码没有任何错误,或者建议的解决方案在我测试时也工作得很好。
下面是我用来测试它的代码:
y1aodyip6#
使用 if 语句检查要检索的元素的长度,
示例: