BeautifulSoup4 Python работает с проанализированными данными - PullRequest
0 голосов
/ 26 ноября 2018
with requests.Session() as s:
auth_return = s.get('https://urproject.com/?page=com_auth_return')
soup = bs(auth_return.text,'html.parser')

то, что я получил, похоже на это.

<script type="text/javascript">
document.location = 'https://urproject.com/admin/php/user_id_check.php?EncData=abcdefg1234&EncKey=hijk9876';
</script>

с этим, я хочу получить EncData и EncKey

EncData = soup.find_all("EncData")
EncKey = soup.find_all("EncKey")

encdatanenckey = {'EncData':EncData,
             'EncKey':EncKey}

print(encdatanenckey)

результат будет

{'EncData': 'abcdefg1234', 'EncKey': 'hijk9876'}

Как я могу получить это .... я должен работать с Regex?Я довольно нуб с регулярным выражением, так что ... не могли бы вы привести пример?

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Сначала вы можете использовать bs4 для извлечения содержимого скрипта, а затем сопоставить определенные данные с помощью регулярного выражения

from bs4 import BeautifulSoup
import re

html = """
<script type="text/javascript" ...></script>
<script type="text/javascript">
document.location = 'https://urproject.com/admin/php/user_id_check.php?EncData=abcdefg1234&EncKey=hijk9876';
</script>
"""
soup = BeautifulSoup(html,'lxml')
js_ = soup.find_all("script",text=True)
regex = r"(?<={}\=).*?(?=&|\'|\")"
EncData = [ re.search(regex.format("EncData"),url.text).group(0)  for url in js_]
EncKey = [ re.search(regex.format("EncKey"),url.text).group(0)  for url in js_]

encdatanenckey = {'EncData':EncData,
             'EncKey':EncKey}

print(encdatanenckey)
# {'EncData': ['abcdefg1234'], 'EncKey': ['hijk9876']}
0 голосов
/ 26 ноября 2018

Если вы уже можете получить URL-адрес изолированным от содержимого скрипта, RegEx можно использовать следующим образом:

import re
# re is a module that provides regular expression matching

url = 'https://urproject.com/admin/php/user_id_check.php? 
EncData=abcdefg1234&EncKey=hijk9876' # this is your example URL

pattern =
re.compile(r'https:\/\/urproject.com\/admin\/php\/user_id_check\.php\?EncData=(.*?)\&EncKey=(.*)')
# this pattern is used to match any URL that has this same structure
result = pattern.match(url)

encdatanenckey = {
    'EncData': result.group(1),
    'EncKey': result.group(2)
}

print(encdatanenckey)

result.group (0) или, что эквивалентно, result.group (), являетсявесь матчКруглые скобки выбирают подсовпадения, называемые группами захвата.С первой парой скобок, которая приводит к result.group (1), второму result.group (2) и т. Д. Включите '\' перед некоторыми специальными символами, чтобы их избежать (у них разные функции внутри RegEx).

0 голосов
/ 26 ноября 2018

Я предполагаю, что вам нужны привилегии для доступа к предоставленному URL, потому что он был неудачным, когда я пытался.В любом случае ниже будет рабочий пример.


Во-первых, вам нужно получить URL-адрес из текста HTML, а не беспорядочный шаблон регулярного выражения, и если все ваши возвращенные HTML одинаковы:

import re
from bs4 import BeautifulSoup

t = '''<script type="text/javascript">document.location = 'https://urproject.com/admin/php/user_id_check.php?EncData=abcdefg1234&EncKey=hijk9876';</script>'''

soup = BeautifulSoup(t,'html.parser')
url = soup.text.split("'")[1]
url
>>'https://urproject.com/admin/php/user_id_check.php?EncData=abcdefg1234&EncKey=hijk9876'

Для Python> 3.4 вы можете использовать метод parse из urllib, что делает его очень простым, а если нет, вам действительно стоит подумать об обновлении.

from urllib import parse
parse_url = parse.parse_qs(parse.urlparse(url).query)
EncData = parse_url['EncData'][0]
EncKey = parse_url['EncKey'][0]

encdatanenckey = {'EncData':EncData,
             'EncKey':EncKey}

print(encdatanenckey)
>>{'EncData': 'abcdefg1234', 'EncKey': 'hijk9876'}

Если вы не используете Python> 3.4, вам придется вручную разбить строки, чтобы получить параметры, которые дали бы те же результаты:

EncData = [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith('EncData' + "=")][0]
EncKey = [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith('EncKey' + "=")][0]
encdatanenckey = {'EncData':EncData,
             'EncKey':EncKey}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...