LXML и BeautifulSoup оба пропустили тег - PullRequest
0 голосов
/ 27 февраля 2019

Я использовал 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-файлом.Но этот тег пропускается функцией findall (".// div") из lxml.

Я скопировал часть HTML-кода и весь метод, который рекурсивно сканирует все теги в следующем.Некоторые данные Unicode, которые не могут пройти через фильтр stackoverflow, заменены на 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

1 Ответ

0 голосов
/ 07 марта 2019

Причина аномалии в том, что отсутствующий тег позже вставляется динамически.Некоторые люди показали нам, что если сканер ждет небольшого временного шлепка, этот тег находится в исходном коде html страницы.

...