【问题标题】:beautifulsoup4 python working with parsed databeautifulsoup4 python 处理解析的数据
【发布时间】:2019-04-27 17:18:41
【问题描述】:
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'}

我怎么会得到这个....我必须使用正则表达式吗? 我对正则表达式很陌生,所以...你能给我举个例子吗?

【问题讨论】:

  • 您好 Taewoo.Lim,如果此处的任何答案有助于解决您的问题,请选中答案旁边的复选框来接受最佳答案。谢谢!

标签: python regex beautifulsoup


【解决方案1】:

首先可以使用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】:

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

    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}
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多