美丽的汤找到隐藏风格的元素

时间:2011-12-20 17:23:41

标签: python html beautifulsoup

我的简单需要。 如何找到目前在网页上看不到的元素?我猜style="visibility:hidden"style="display:none"是隐藏元素的简单方法,但BeautifulSoup不知道它是否隐藏。

例如,HTML是:

Textbox_Invisible1: <input id="tbi1" type="text" style="visibility:hidden">
Textbox_Invisible2: <input id="tbi2" type="text" class="hidden_elements">
Textbox1: <input id="tb1" type="text">

所以我首先关注的是BeautifulSoup无法找出是否隐藏了上述任何文本框:

# Python 2.7
# Import BeautifulSoup
>>> source = """Textbox_Invisible1: <input id="tbi1" type="text" style="visibility:hidden">
...  Textbox_Invisible2: <input id="tbi2" type="text" class="hidden_elements">
...  Textbox1: <input id="tb1" type="text">"""
>>> soup1 = BeautifulSoup(source)
>>> soup1.find(id='tb1').hidden
False
>>> soup1.find(id='tbi1').hidden
False
>>> soup1.find(id='tbi2').hidden
False
>>> 

我唯一的问题是,有没有办法找出隐藏哪些元素? (我们还必须考虑复杂的HTML,其中可能隐藏了元素)

5 个答案:

答案 0 :(得分:3)

BeautifulSoup是 html解析器,而不是浏览器。它不知道如何呈现页面,计算DOM属性等,它正在检查尖括号的开始和结束位置。

如果你需要在运行时使用DOM,你最好使用浏览器自动化软件包,即启动浏览器,让浏览器使用页面,然后公开浏览器控件和计算出的DOM 。根据平台的不同,您有不同的选择。在Python WIki上查看this page的想法,查看围绕Web“Python库”和“浏览器技术”的 Python Wrappers部分。

答案 1 :(得分:2)

使用BeautifulSoup,我担心你需要明确检查用于隐藏元素的属性:

soup = BeautifulSoup(source)
tbi1 = soup.find(id='tbi1')
tbi2 = soup.find(id='tbi2')
print tbi1['style'] == 'visibility:hidden'
print tbi2['class'] == 'hidden_elements'

答案 2 :(得分:0)

试试这个(bs4),对我有用:

print soup1.select( '[style~="visibility:hidden"]' )
print soup1.select( '[style~="display:none"]' )

.select方法使用CSS2选择器: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

答案 3 :(得分:0)

根据第一篇文章中的说明,我认为这满足了仅在加载时查找对用户隐藏的所有元素的需要(不是动态或计算渲染,而是发送到进程的原始源)。

如果是动态呈现的,那么您应该使用 Selenium 之类的东西来查看源的当前状态,该状态可能会根据任意数量的条件(用户角色、公共私有、点击或未点击的内容,或者发生变化的内容)加载)

我在脑子里想着这个,所以请原谅,但是这个:

from bs4 import BeautifulSoup

source = """Textbox_Invisible1: <input id="tbi1" type="text" style="visibility:hidden">
Textbox_Invisible2: <input id="tbi2" type="text" class="hidden_elements">
Textbox1: <input id="tb1" type="text">"""

soup = BeautifulSoup(source, "lxml")

# returns a list of 'bs4.element.Tag' objects where style=visibility:hidden
# for class change {"style":"visibility:hidden"} to {"class":"hidden_elements"}
all_my_visible_elements = soup.find_all(True, {"style":"visibility:hidden"})```

答案 4 :(得分:-1)

嘿,也许有人还是需要这个 我正在使用的一些提示是顶部将<!-替换为空白 像这样 汤= BeautifulSoup(url.text.replace('<!-',''),'html.parser') 对我来说效果很好,具体取决于html来源,也许您需要进行一些更改