【问题标题】:Python BeautifulSoup how to extract var result from javascript element?Python BeautifulSoup 如何从 javascript 元素中提取 var 结果?
【发布时间】:2020-05-31 17:30:40
【问题描述】:

我是 Python 新手,我一直在尝试使用 BeautifulSoup 从脚本元素中定义的变量中提取一个特定的数据行。

代码:

import requests
from bs4 import BeautifulSoup
import esprima

#----------------some comment'

URL = 'https://downdetector.com/status/facebook/'

browser = {'user-agent': 'my agent'}


#--------------some comment:
page = requests.get(URL, headers=browser)
soup = BeautifulSoup(page.content, 'html.parser')


#---------------some comment:

chart = soup.find("div",{"class":"popover-container justify-content-center p-relative"}).script.get_text()
print(chart)

输出:

var data = {
status: 'success',  
baseline: 29,       
communicate: null,  
company: 'Facebook',
max: 66,
series: [

                      { x: '2020-05-30T13:22:28.168484-04:00', y: 25  },

                      { x: '2020-05-30T13:37:28.168484-04:00', y: 27  },

                      .....

                      { x: '2020-05-31T13:07:28.168484-04:00', y: 30  },

                  ]
                }

                $(function () {
                  chartThis(data, 'holder', 'line')
                });

                if (data.communicate && $('#dd-communicate').length) {
                  $('#dd-communicate').html('<div class="border text-left d-inline-block p-2"><i class="fa" aria-hidden="true" style="color: red; width:16px; height:12px; background:url(https://cdn2.downdetector.com/d328eb8cbe4e164/images/v2/message.svg) no-repeat"></i>'
                    +'<span class="d-inline-block px-1">'+ data.company+' &bull;  ' + moment.utc(data.communicate.created_at).fromNow()
                    + '</span><p class="font-weight-bold my-0">'+ data.communicate.message + '</p></div>')
                }

你知道从上面的 var 结果中提取“最大值”的简单方法吗?

我尝试过使用 esprima,但仍然没有运气,因为我遇到了错误:

Traceback(最近一次调用最后一次):文件 “c:/test.py,第 31 行,在 if token["type"] == "Identifier" and token["value"] == "max": TypeError: 'BufferEntry' object is not subscriptable

我的 esprima 代码如下所示:

import requests
from bs4 import BeautifulSoup
import esprima

#----------------some comment'

URL = 'https://downdetector.com/status/facebook/'

browser = {'user-agent': 'my agent'}


#--------------some comment:
page = requests.get(URL, headers=browser)
soup = BeautifulSoup(page.content, 'html.parser')


#---------------some comment:

chart = soup.find("div",{"class":"popover-container justify-content-center p-relative"}).script.get_text()

tokens = esprima.tokenize(chart)

token_iterator = iter(tokens)

for token in token_iterator:
    if token["type"] == "Identifier" and token["value"] == "max":
        value_token = next(next(token_iterator))
        result = value_token["value"]

任何帮助将不胜感激!

【问题讨论】:

    标签: python beautifulsoup esprima-python


    【解决方案1】:

    提取最大值的快速解决方案是在chart 上使用split

    import requests
    from bs4 import BeautifulSoup
    
    URL = 'https://downdetector.com/status/facebook/'
    browser = {'user-agent': 'my agent'}
    
    page = requests.get(URL, headers=browser)
    soup = BeautifulSoup(page.content, 'html.parser')
    
    
    chart = soup.find("div",{"class":"popover-container justify-content-center p-relative"}).script.get_text()
    max_val= chart.split("max: ")[1].split(",")[0]
    
    print(max_val)
    
    OUT: 64
    

    【讨论】:

    • 尼科,感谢您的快速回答!有了这些信息,我尝试将电子邮件自动发送到我的收件箱,但我收到了一个错误:“文件“c:/test.py”,第 46 行,在 if (max_val
    • 您可以使用 int(max_val)
    • 是的,我想我可能需要为第二部分提出另一个问题,因为您最初回答了原始问题 - 非常感谢。添加 int(max_val) > 50 后,它仍然给出相同的错误。 :( 我将在下一条评论中留下更多代码:
    • "import smtplib if int(max_val > 50): send_mail() def send_mail(): server = smtplib.SMTP('smtp.gmail.com', 587) server.ehlo() 服务器。 starttls() server.ehlo() server.login('email', 'pw') subject = 'test' body = 'test/' msg = f"Subject: {subject}\n\n{body}" 服务器。 sendmail( '来自电子邮件', '到电子邮件', msg ) print('成功发送') server.quit()"
    • 哦哇,这是一个快速修复哈哈 - 它的工作!非常感谢你,尼科。 :)
    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多