如何使用 python 解析 ld+json

Posted

技术标签:

【中文标题】如何使用 python 解析 ld+json【英文标题】:How to parse ld+json using python 【发布时间】:2017-09-25 02:16:10 【问题描述】:

我一直在尝试一些网页抓取,我发现了一些位于该标签内的有趣数据:

<script type="application/ld+json">

我已经能够用漂亮的汤隔离那个标签

html = urlopen(url)
soup = BeautifulSoup(html, "lxml")

p = soup.find('script', 'type':'application/ld+json')
print p

但我无法处理数据或从该标签中提取任何数据。

如果我尝试使用正则表达式从中获取一些东西,我会得到:

TypeError: expected string or buffer

如何从该脚本标签中获取数据并像使用字典或字符串一样使用它?顺便说一句,我使用的是 python 2.7。

【问题讨论】:

【参考方案1】:

您应该使用json.loads 读取 JSON 以将其转换为字典。

import json

import requests
from bs4 import BeautifulSoup

def get_ld_json(url: str) -> dict:
    parser = "html.parser"
    req = requests.get(url)
    soup = BeautifulSoup(req.text, parser)
    return json.loads("".join(soup.find("script", "type":"application/ld+json").contents))

join / contents 组合删除脚本标签。

【讨论】:

【参考方案2】:

你应该阅读要解析的html

html = urlopen(url).read()
soup = BeautifulSoup(html, "html.parser")
p = soup.find('script', 'type':'application/ld+json')
print p.contents

【讨论】:

我从“html/read()”中收到一条错误消息)它说: Traceback(最近一次调用最后一次):文件“test.py”,第 20 行,在 get_price () 文件“test.py”,第 16 行,在 get_price soup = BeautifulSoup(html, “html.read()”) 文件“C:\PYTHON27\lib\site-packages\bs4_init_ .py",第 165 行,在 init % ",".join(features)) bs4.FeatureNotFound:找不到具有您请求的功能的树构建器:html.read()。需要安装解析器库吗? 如果你需要你可以使用 lxml 代替 @wessels 如果只需要其中的文本,请使用 print p.find(text=True)【参考方案3】:

上面的 cmets 没有帮助(不过谢谢)

最后我用了:

p = str(soup.find('script', 'type':'application/ld+json'))

我将它强制转换为一个不太漂亮的字符串,但它完成了工作。我知道那里可能有更好的方法,但这对我有用。

【讨论】:

以上是关于如何使用 python 解析 ld+json的主要内容,如果未能解决你的问题,请参考以下文章

如何生成和解析json格式数据

解析 json 时如何使按钮从 json 加载 url?

如何使用JSON-LD创建SiteNavigationElement?

如何使用Ajax动态更新JSON-LD脚本?

如何使用 C# 在 ASP.NET 3.5 中动态设置“application/ld+json”Schema.org 元数据

如何在需要等待内容加载的动态页面上使用 JSON-LD 添加结构化数据?