我正在使用beautifulsoup在以下位置解析页面:
https://irs.thsrc.com.tw/IMINT/
在渲染中,在所有其他要求确认的标签之前会弹出一个确认框。
该标记位于具有xpath的唯一表单标记内:/ html / body / div [1] / form / div [2]。
此标记和/ html / body / div [1] / form / div [1]上的先前标记都具有样式属性“ display:none”。
奇怪的是beautifulsoup会跳过第二个标签。
我当时想这可能是beautifulsoup中的错误,并用LXML重写了代码。
但是事实证明,LXML也跳过了第二个标签。
实际上,如果我使用root.findall(“ .// div”),则返回的列表也将不包含跳过的标签,因为应该有一个带有xpath / html / body / div [2] / form / div [ 2] / div [1] / div [1] / div [1] / div [1](根据html源文件)。但是lxml的findall(“ .// div”)会跳过此标签。
我复制了html代码的一部分以及下面递归扫描所有标签的整个方法。 一些无法通过stackoverflow过滤器的unicode数据被更改为ascii。
如果有人能告诉我如何获取等待确认的弹出标签,我将非常感谢。
谢谢
<html>
<head>
<title> taiwan hsrc </title>
</head>
<body topmargin="0" rightmargin="0" bottommargin="0" bgcolor="#FFFFFF" leftmargin="0">
<!----- error message ends ----->
<form action="/IMINT/;jsessionid=4A74C40B8D68474DF0B6F49E953DD825?wicket:interface=:0:BookingS1Form::IFormSubmitListener" id="BookingS1Form" method="post">
<div style="display:none">
<input type="hidden" name="BookingS1Form:hf:0" id="BookingS1Form:hf:0" />
</div>
<div style="display:none; padding:3px 10px 5px;text-align:center;" id="dialogCookieInfo" title="Taiwan high-speed rail" wicket:message="title=bookingdialog_3">
<div class="JCon">
<div class="TCon">
<div class="overDiffText">
<div style="text-align: left;">
<span>for better service
<a target="_blank" class="c" style="color:#FF9900;" href="https://www.thsrc.com.tw/tw/Article/ArticleContent/d1fa3bcb-a016-47e2-88c6-7b7cbed00ed5?tabIndex=1">
privacy
</a>
。
</span>
</div>
</div>
<div class="action">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td>
<input hidefocus="true" name="confirm" id="btn-confirm" type="button" class="button_main" value="我同意"/>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div id="content" class="content">
<!----- marquee starts ----->
<marquee id="marqueeShow" behavior="scroll" scrollamount="1" direction="left" width="755">
</marquee>
<!----- marquee ends ----->
<div class="tit">
<span>一般訂票</span>
</div>
</form>
|</div>
</body>
</html>
我使用LXML扫描html的代码如下。
def actionableLXML(cls, e):
global count
print ("rec[", count, "], xpath: ", xmlTree.getpath(e))
countLabelActionableInside += 1
flagActionableInside = False
if e.tag in cls._clickable_tags \
or e.tag == 'input' or e.tag == 'select':
flagActionableInside = True
else:
flagActionableInside = False
for c in e.getchildren():
flagActionableInside |= cls.actionableLXML(c)
if e.attrib and 'style' in e.attrib \
and 'display:' in e.attrib['style'] \
and 'none' in e.attrib['style']:
if not flagActionableInside:
e.getparent().remove(e)
return flagActionableInside
使用BeautifulSoup的代码如下。
@classmethod
def actionableBS(cls, e):
global countLabelActionableInside
print ("rec actionable inside[", countLabelActionableInside, "], xpath: ", DomAnalyzer._get_xpath(e))
countLabelActionableInside += 1
flagActionableInside = False
if e.name == 'form':
print ("caught form!")
if e.name in cls._clickable_tags or e.name == 'input' or e.name == 'select':
flagActionableInside = True
else:
flagActionableInside = False
if hasattr(e, 'children'):
for c in e.children:
flagActionableInside |= cls.actionableBS(c)
if e.attrs and e.has_attr('style') and 'display:' in e['style'] and 'none' in e['style']:
# if element.name in cls._clickable_tags or element.name == 'input' or element.name == 'select':
if not flagActionableInside:
e.decompose()
return flagActionableInside
答案 0 :(得分:0)
出现异常的原因是,丢失的标签随后会动态插入。有人告诉我们,如果搜寻器等待一小段时间,那么该标记将在页面的html源代码中。