我的简单需要。
如何找到目前在网页上看不到的元素?我猜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,其中可能隐藏了元素)
答案 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来源,也许您需要进行一些更改