【问题标题】:Scraping a javascript response through beautifulsoup, possible?通过beautifulsoup 抓取javascript 响应,可能吗?
【发布时间】:2021-12-31 18:39:05
【问题描述】:

服务器返回以下响应,显然是 javascript 内容,我想抓取它,但我无法做到。

Element.update("to_users2", "\n\n\n

\n
\n 选择成​​员\n
\n
\n
全选 添加 \n\n \n \n \n
TestUserOne 添加 \n\n \n \n \n
TestUserTwo 添加\ n\n \n \n \n \n \n\n\n\n");

基本上,我尝试了多种可能性,例如将响应对象转换为字符串,然后替换所有\n 等等,然后使用生成的html 我还尝试使用requests_html,这几乎让我期待结果,但仍然无法获得预期的结果。在这种情况下,我希望刮掉a 标签中的add_recipient(2)a 标签文本TestUserOne。在requests_html,我可以这样做:

htm = '''Element.update("to_users2", "\n\n\n<div class="label-field-pair">\n <div class="label-field-pair11">\n <label for="student_grade">Select member\n <div class ="scrolable" >\n <div class="scroll-inside">\n <div class="hover"><a href="#" class="all" onClick="add_all_recipient('2,4')">Select all Add \n\n \n \n \n <div class="hover"><a href="#" before="Element.show('loader')" class="individual" onClick="add_recipient(2)" success="Element.hide('loader')">TestUserOne Add \n\n \n \n \n <div class="hover"><a href="#" before="Element.show('loader')" class="individual" onClick="add_recipient(4)" success="Element.hide('loader')">TestUserTwo Add \n\n \n \n \n \n \n\n\n\n");'''

html = HTML(html=htm)
print(html.find('a'))

它给出了输出

<Element 'a' href='\\"#\\"' before='\\"Element.show(\'loader\')\\"' class=('\\"individual\\"',) onclick='\\"add_recipient(4)\\"' success='\\"Element.hide(\'loader\')\\"'>,

在这里,我想抓取onclick 的值,从而在此上下文中获得a 标记文本,如TestUserOne Add

从这里到哪里?尝试了所有可能性,但无济于事。任何帮助将不胜感激。

【问题讨论】:

    标签: python web-scraping beautifulsoup python-requests-html


    【解决方案1】:

    我认为使用 BeautifulSoup 解析 JavaScript 值是不可能的。一种解决方案是使用正则表达式:

    ma​​in.py

    import re
    
    resp = """
    Element.update("to_users2", "\n\n\n<div class="label-field-pair">\n <div class="label-field-pair11">\n <label for="student_grade">Select member\n <div class ="scrolable" >\n <div class="scroll-inside">\n <div class="hover"><a href="#" class="all" onClick="add_all_recipient('2,4')">Select all Add \n\n \n \n \n <div class="hover"><a href="#" before="Element.show('loader')" class="individual" onClick="add_recipient(2)" success="Element.hide('loader')">TestUserOne Add \n\n \n \n \n <div class="hover"><a href="#" before="Element.show('loader')" class="individual" onClick="add_recipient(4)" success="Element.hide('loader')">TestUserTwo Add \n\n \n \n \n \n \n\n\n\n");
    """
    
    print(re.findall(r"add_recipient\(([0-9+])\)\" success=.+>([a-zA-Z0-9\w]+) Add", resp))
    
    $ python main.py
    [('2', 'TestUserOne'), ('4', 'TestUserTwo')]
    

    【讨论】:

    • 以下:从服务器TypeError: expected string or bytes-like object传递响应时出现此错误
    • 那是因为find() 将返回一个BeautifulSoup.Tag 对象。在尝试在正则表达式中使用它之前将其转换为字符串。
    • 很好地使用str(res),将其转换为字符串yield[]
    • res 到底是什么?请求响应对象?你的主帖里没有。没有任何关于您实际在做什么的背景信息,没有人可以帮助您。
    • res = requests.post(req_url, headers=headers, cookies=cookies, data=data) 因为它很敏感,所以我不能透露所有代码,但是在您发布的代码中可以正常工作,但是当将 re.findall(r"add_recipient\(([0-9+])\)\" success=.+&gt;([a-zA-Z0-9\w]+) Add", resp) 替换为 re.findall(r"add_recipient\(([0-9+])\)\" success=.+&gt;([a-zA-Z0-9\w]+) Add", str(res)) 时,只出现 []
    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2018-09-21
    相关资源
    最近更新 更多