繁体   English   中英

beautifulsoup4 python处理已解析的数据

[英]beautifulsoup4 python working with parsed data

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

我假设您需要特权才能访问提供的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,您可以使用urllibparse方法,这使它非常容易,如果不是,则应考虑升级。

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}

首先,您可以使用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']}

如果您已经可以获取与脚本内容隔离的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中具有不同的功能)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM