【发布时间】:2014-04-22 13:29:27
【问题描述】:
我正在使用 Python 和 BeautifulSoup4,我需要检索页面上的可见链接。鉴于此代码:
soup = BeautifulSoup(html)
links = soup('a')
我想创建一个方法is_visible 来检查页面上是否显示链接。
使用 Selenium 的解决方案
由于我也在使用 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()
性能问题
不幸的是,is_displayed 方法和获取文本属性执行 http 请求来检索此类信息。因此,当页面上有许多链接或您必须多次执行此操作时,事情会变得非常缓慢。
另一方面,BeautifulSoup 可以在获得页面源后零时间执行这些解析操作。但我不知道该怎么做。
【问题讨论】:
-
我认为你能做的最好的就是检查美丽汤标签的
style属性并解析该值以查看其中是否有类似的display:none。 -
不幸的是,Beautifulsoup 是一个 html 解析器,而不是浏览器,所以它对如何渲染页面一无所知。我认为你必须坚持使用 Selenium。
-
pyself,我很确定@fasouto 是对的。 beautifulsoup 实际上并没有渲染任何东西,如果你阅读 selenium 文档,它会自动化 BROWSERS.. 而不仅仅是纯 HTML。如果你真的想这样做,我认为你必须坚持使用 selenium 来做这件事。
-
元素被内联、链接或内部 CSS 隐藏(
input除外)。或者用JS隐藏。然后你有其他不可见的东西,比如白色背景上的白色文本。你到底想检查什么?只有 CSSdisplay:none?比您需要使用 tinycss 解析 all 样式表并查看规则是否与元素匹配。如果找到匹配项,请检查应用了哪些样式。困难在于级联部分。此外,如果隐藏了父级,则隐藏了子级。因此,您必须检查该元素的所有父元素是否也可见......或者只使用 Selenium。
标签: python selenium web beautifulsoup