无法获取新标签中显示的某些信息

时间:2019-07-13 20:56:33

标签: python python-3.x web-scraping

我已经使用请求模块在python中创建了一个脚本,以获取使用此电子邮件africk2@nd.edu填写表单后显示的一些信息。问题是,当我按下搜索按钮时,我可以看到一个新选项卡,其中包含我想获取的所有信息。此外,我在chrome开发工具的All部分下的Network标签中看不到任何链接。因此,我对于如何使用请求模块获取信息毫无希望。

website address

  

手动填充结果的步骤:

     

将此电子邮件地址africk2@nd.edu放在Email address的输入框旁边,然后点击Search按钮。

我尝试过:

import requests
from bs4 import BeautifulSoup

url = "https://eds.nd.edu/search/index.shtml"
post_url = "https://eds.nd.edu/cgi-bin/nd_ldap_search.pl"

res = requests.get(url,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(res.text,"lxml")
payload = {item['name']:item.get('value','') for item in soup.select('input[name]')}
payload['email'] = 'africk2@nd.edu'
del payload['clear']

resp = requests.post(post_url,data=payload)
print(resp.content)

上面的脚本是错误的方法。但是,我找不到任何方法来获取与该电子邮件相关的信息。

P.S。我不追求面向硒的解决方案。

1 个答案:

答案 0 :(得分:1)

好,解决了:

from urllib.parse import quote

import requests


def get_contact_html(email: str):
    encoded = quote('o=\"University of Notre Dame\", '
                    'st=Indiana, '
                    'c=US?displayName,edupersonaffiliation,ndTitle,ndDepartment,postalAddress,telephoneNumber,mail,searchGuide,labeledURI,'
                    'uid?'
                    'sub?'
                    f'(&(ndMail=*{email}*))')
    data = {
        "ldapurl": f'LDAP://directory.nd.edu:389/{encoded}',
        "ldaphost": "directory.nd.edu",
        "ldapport": '389',
        "ldapbase": 'o="University of Notre Dame", st=Indiana, c=US',
        "ldapfilter": f'(&(ndMail=*{email}*))',
        "ldapheadattr": "displayname",
        "displayformat": "nd",
        "ldapmask": "",
        "ldapscope": "",
        "ldapsort": "",
        "ldapmailattr": "",
        "ldapurlattr": "",
        "ldapaltattr": "",
        "ldapjpgattr": "",
        "ldapdnattr": "",
    }
    res = requests.post('https://eds.nd.edu/cgi-bin/nd_ldap_search.pl',
                        data=data)
    res.raise_for_status()
    return res.text


if __name__ == '__main__':
    html = get_contact_html('africk2@nd.edu')
    print(html)

输出:

...
Formal Name:
...
Aaron D Frick
...

这将为您提供页面的HTML。 技巧是将+字段中的编码空间转换为实空间"ldapbase": 'o="University of Notre Dame", st=Indiana, c=US',,并让requests模块对值本身进行编码。否则,+符号将进行双重编码。