beautifulsoup4 python处理已解析的数据

时间:2018-11-26 04:18:44

标签: python regex beautifulsoup

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相当陌生,所以...您能举个例子吗?

3 个答案:

答案 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中具有不同的功能)。