Захват текста предупреждения JavaScript с помощью BeautifulSoup - PullRequest
0 голосов
/ 01 марта 2019

Я использую этот JavaScript для проверки формы:

<script type="text/javascript">
        function validateForm()
        {
            var a=document.forms["orderform"]["Name"].value;
            var b=document.forms["orderform"]["Street"].value;
            var c=document.forms["orderform"]["ZIP"].value;
            var d=document.forms["orderform"]["City"].value;
            var e=document.forms["orderform"]["PhoneNumber"].value;
            if (
                a==null || a=="" || 
                b==null || b=="" || 
                c==null || c=="" || 
                d==null || d=="" || 
                e==null || e==""
                )
            {alert("Please fill all the required fields.");
            return false;
            }
        }
      </script>

Я пытаюсь захватить текст предупреждения, используя BeatifulSoup:

import re
from bs4 import BeautifulSoup

with open("index.html") as fp:
  soup = BeautifulSoup(fp, "lxml")

for script in soup.find_all(re.compile("(?<=alert\(\").+(?=\")")):
  print(script)

Это ничего не возвращает.Это основано на примере, приведенном в документации BS под «Регулярным выражением», чтобы найти имена тегов, начинающиеся с «b»:

import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)
# body
# b

, но мне кажется, что я не могу найти эквивалент «print»(tag.name) ', который будет печатать текст предупреждения.Или я совершенно не на том пути?Любая помощь очень ценится.

Редактировать: Я пытался:

pattern = re.compile("(?<=alert\(\").+(?=\")"))
for script in soup.find_all ('script'):
  print(script.pattern)

Это возвращает "Нет".

Ответы [ 2 ]

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

Запуск по всем html данным не будет работать.Сначала вам нужно извлечь данные script, затем вы можете легко разобрать текст alert.

import re
from bs4 import BeautifulSoup

with open("index.html") as fp:
  soup = BeautifulSoup(fp, "lxml")

script = soup.find("script").extract()

# find all alert text
alert = re.findall(r'(?<=alert\(\").+(?=\")', script.text)
print(alert)

Выход:

['Please fill all the required fields.']
0 голосов
/ 02 марта 2019

Если я правильно вас понимаю, это может быть то, что вы ищете:

html = """
 <script type="text/javascript">
    function validateForm()
    {
        var a=document.forms["orderform"]["Name"].value;
        var b=document.forms["orderform"]["Street"].value;
        var c=document.forms["orderform"]["ZIP"].value;
        var d=document.forms["orderform"]["City"].value;
        var e=document.forms["orderform"]["PhoneNumber"].value;
        if (a==null || a=="", b==null || b=="", a==null || c=="", c==null || d=="", d==null || e=="", a==null || e=="")
        {alert("Please fill all the required fields.");
        return false;
        }
    }
  </script>
   """

soup = BeautifulSoup(html, "lxml")
alert = soup.text.split('"')
alert[33] 

Вывод:

'Please fill all the required fields.'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...