Python 如何检查web元素是否可见

Python 如何检查web元素是否可见,python,selenium,web,beautifulsoup,Python,Selenium,Web,Beautifulsoup,我正在使用Python和BeautifulSoup4,我需要检索页面上的可见链接。鉴于此代码: soup = BeautifulSoup(html) links = soup('a') 我想创建一个方法来检查页面上是否显示链接 硒溶液 由于我也在使用Selenium,我知道存在以下解决方案: from selenium.webdriver import Firefox firefox = Firefox() firefox.get('https://google.com') links =

我正在使用Python和BeautifulSoup4,我需要检索页面上的可见链接。鉴于此代码:

soup = BeautifulSoup(html)
links = soup('a')
我想创建一个方法来检查页面上是否显示链接

硒溶液 由于我也在使用Selenium,我知道存在以下解决方案:

from selenium.webdriver import Firefox

firefox = Firefox()
firefox.get('https://google.com')
links = firefox.find_elements_by_tag_name('a')

for link in links:
    if link.is_displayed():
        print('{} => Visible'.format(link.text))
    else:
        print('{} => Hidden'.format(link.text))

firefox.quit()
性能问题 不幸的是,显示方法和获取文本属性执行http请求来检索此类信息。因此,当一个页面上有很多链接,或者你不得不多次这样做时,事情会变得非常缓慢


另一方面,一旦获得页面源,BeautifulSoup可以在零时间内执行这些解析操作。但是我不知道怎么做。

好的,BeautifulSoup只会帮助您解析HTML文档的实际标记。如果这就是你所需要的,那么你可以这样做(是的,我已经知道它并不完美):


BeautifulSoup不考虑其他会告诉您元素是否可见的方面,例如:CSS、脚本和动态DOM更改。另一方面,Selenium会告诉您一个元素实际上是否正在呈现,并且通常是通过给定浏览器中的可访问性API来呈现的。你必须决定是否值得为了速度而牺牲准确性。祝你好运!:-)

尝试使用
通过xpath查找元素
执行脚本

from selenium import webdriver

driver = webdriver.Chrome()

driver.get("https://www.google.com/?hl=en")
links = driver.find_elements_by_xpath('//a')

driver.execute_script('''
    var links = document.querySelectorAll('a');

    links.forEach(function(a) {
        a.addEventListener("click", function(event) {
            event.preventDefault();
        });
    });
''')

visible = []
hidden = []
for link in links:
    try:
        link.click()
        visible.append('{} => Visible'.format(link.text))
    except:
        hidden.append('{} => Hidden'.format(link.get_attribute('textContent')))

    #time.sleep(0.1)

print('\n'.join(visible))
print('===============================')
print('\n'.join(hidden))
print('===============================\nTotal links length: %s' % len(links))

driver.execute_script('alert("Finish")')

我认为最好的方法是检查beautiful soup标记的
style
属性,并解析该值,看看是否
display:none
中有类似的内容。不幸的是,Beautifulsoup是一个html解析器,而不是一个浏览器,因此它对页面的呈现方式一无所知。我认为你必须坚持Selenium.pyself,我很确定@fasouto是正确的。beautifulsoup实际上并不渲染任何内容,如果您阅读selenium文档,它会自动执行浏览器。。不仅仅是简单的HTML。我认为如果你真的想这样做,你必须坚持使用selenium。元素通过内联、链接或内部CSS隐藏(
input
除外)。或者用JS隐藏。然后你有其他看不见的东西,比如白色背景上的白色文本。你到底想查什么?仅CSS
显示:无
?然后,您需要使用tinycss解析所有样式表,并查看规则是否与元素匹配。如果找到匹配项,请检查应用的样式。难点在于级联部分。此外,如果父对象被隐藏,则子对象也被隐藏。因此,您必须检查该元素的所有父元素是否也可见。。。或者只需坚持使用硒。看看这条线索:
from selenium import webdriver

driver = webdriver.Chrome()

driver.get("https://www.google.com/?hl=en")
links = driver.find_elements_by_xpath('//a')

driver.execute_script('''
    var links = document.querySelectorAll('a');

    links.forEach(function(a) {
        a.addEventListener("click", function(event) {
            event.preventDefault();
        });
    });
''')

visible = []
hidden = []
for link in links:
    try:
        link.click()
        visible.append('{} => Visible'.format(link.text))
    except:
        hidden.append('{} => Hidden'.format(link.get_attribute('textContent')))

    #time.sleep(0.1)

print('\n'.join(visible))
print('===============================')
print('\n'.join(hidden))
print('===============================\nTotal links length: %s' % len(links))

driver.execute_script('alert("Finish")')