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合作吗? 我对regex相当陌生,所以...您能举个例子吗?
答案 0 :(得分:2)
我假设您需要特权才能访问提供的URL,因为尝试时该URL不成功。无论如何,下面都是一个可行的示例。
首先,您需要从HTML文本中获取URL,而不是凌乱的正则表达式模式,并且如果返回的所有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}
答案 1 :(得分:2)
首先您可以使用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']}
答案 2 :(得分:1)
如果您已经可以获得与脚本内容隔离的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中具有不同的功能)。