【问题标题】:Can't dig out nicely formatted json content out of some messy script无法从一些杂乱的脚本中挖掘出格式良好的 json 内容
【发布时间】:2019-05-24 19:19:08
【问题描述】:

我已经使用 requests 模块以及 BeautifulSoup 库和 re 模块在 python 中编写了一个脚本,以获取一个可用格式良好的 json 内容的脚本。问题是我喜欢使用 re 来从整个凌乱的脚本中脱颖而出。

该脚本在包含var masterCompanyData = 的源代码中。

Website link

这是带有 json 内容的脚本的样子(可以看到执行以下脚本):

import re
import requests
from bs4 import BeautifulSoup

url = 'https://conference.iste.org/2019/exhibitors/floorplan.php'

r = requests.get(url)
soup = BeautifulSoup(r.text,"lxml")
script = soup.select_one("script:contains('masterCompanyData')").text
# p = re.compile(r'masterCompanyData = (.*);')
# jsonContent = p.findall(script)
# print(jsonContent)
print(script)

帮助我了解这一点的字符串操作:

items = soup.select_one("script:contains('masterCompanyData = ')").text.split("masterCompanyData = ")[1].split("Holder for the current zoom value")[0].split("/**")[0].replace(";","").strip()

由于我已经使用字符串操作成功地挖出了那部分,我不希望那样做;相反,我喜欢使用正则表达式提取该 json 内容,但我得到的是空列表。

如何使用正则表达式获取该 json 内容?

【问题讨论】:

  • 这不是一个js对象。有多个。你只想要第一个吗?
  • 我想要this,我已经在使用字符串操作。但是,我希望使用正则表达式 @QHarr 来实现。

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


【解决方案1】:

试试下面的正则表达式

import requests
import re
import json

r = requests.get('https://conference.iste.org/2019/exhibitors/floorplan.php')
p1 = re.compile(r'var masterCompanyData = (.*?);\n\n\n', re.DOTALL)
item = p1.findall(r.text)[0]
data = json.loads(item)

使用你的想法:

import requests
import re
import json
from bs4 import BeautifulSoup as bs

r = requests.get('https://conference.iste.org/2019/exhibitors/floorplan.php')
p1 = re.compile(r'var masterCompanyData = (.*?);\n\n\n', re.DOTALL)
soup = bs(r.content, 'lxml')
script = soup.select_one("script:contains('masterCompanyData')").text
string = p1.findall(script)[0]
x = json.loads(string)

【讨论】:

    【解决方案2】:
    import json
    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://conference.iste.org/2019/exhibitors/floorplan.php'
    
    r = requests.get(url)
    soup = BeautifulSoup(r.text,"lxml")
    # p = re.compile(r'masterCompanyData = (.*);')
    # jsonContent = p.findall(script)
    # print(jsonContent)
    for s in soup.findAll('script'):
        if 'var masterCompanyData' in str(s):
            finalstr = ''
            for line in str(s).split('\n'):
                if 'var masterCompanyData' in line:
                    finalstr = line.split('=')[-1]
                    continue
                if line[-2:] == '};' and finalstr:
                    finalstr += line[:-1]
                    break
                if finalstr:
                    finalstr+=line
            break
    

    finalstr 现在是一个包含所需 JSON 的字符串。如果需要,可以在循环之后执行此操作:

    import json
    dictWithJSON = json.loads(finalstr)
    

    【讨论】:

    • 我的问题是寻求有关正则表达式的任何解决方案,否则,items = soup.select_one("script:contains('masterCompanyData = ')").text.split("masterCompanyData = ")[1].split("Holder for the current zoom value")[0].split("/**")[0].replace(";","").strip() 可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 2018-04-29
    • 2011-05-04
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多