我有这些不同的链接,每个链接都包含不同的内容,我试图从这些链接中获取数据。
我在某种程度上取得了成功,但现在我陷入困境,正在寻求帮助以更好地理解《美丽汤》。
文档在这件事上对我没有多大帮助,没有Google搜索能够帮助我。
我的脚本是这样的:
r = requests.get(link)
raw = r.text
soup = BeautifulSoup(raw, features="html.parser")
inputTag = soup.find("input", {"id": "videoId"})
output = inputTag["value", "videoUrl"]
print(output)
我似乎无法弄清楚如何在长字符串中获取特定的输入值(在每个“&”之后):
<input type="text" style="display: none" id="videoId" value="&videoId=139209&videoUrl=https://mp5.website.net/storage1/M03/10/92/aPODC10sfP-AcFDnAGhUgdKc7iA667.mp4&videoImg=https://mp5.website.net/storage1/M03/10/97/aPODCl0sfP-ACNFjAABmn9NL64Q064.png&videoIntroduction=[{"content":"Everything in the world is a matrix","type":1,"userId":""}]userNickName=Califax'>
如果我这样离开output = inputTag["value"]
,我会得到“值”,但是如何解析例如videoId =和videoUrl =会让我感到困惑。
希望有人可以在正确的方向上指导我如何实现这一目标。
编辑JSON部分。
有了您的建议代码,我现在得到此错误:
Traceback (most recent call last):
File "/run/media/anonymous/06bcf743-8b4d-409f-addc-520fc4e19299/PycharmProjects/learningcurve/video_moments.py", line 34, in <module>
videoIntroduction = json.loads(output['videoIntroduction'][0])
File "/usr/lib/python3.7/json/__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.7/json/decoder.py", line 340, in decode
raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 85 (char 84)
答案 0 :(得分:2)
您可以使用urllib
(@ facelessuser指出的固定格式
import urllib.parse
import json
value = '&videoId=139209&videoUrl=https://mp5.website.net/storage1/M03/10/92/aPODC10sfP-AcFDnAGhUgdKc7iA667.mp4&videoImg=https://mp5.website.net/storage1/M03/10/97/aPODCl0sfP-ACNFjAABmn9NL64Q064.png&videoIntroduction=[{"content":"Everything in the world is a matrix","type":1,"userId":""}]userNickName=Califax'
由于此格式不正确,因此可以进行一些基本修复。像这样:
fixed_value = value.replace(']user', ']&user')
output = urllib.parse.parse_qs(fixed_value)
其中 产量 一种 字典
{'videoId': ['139209'], 'videoUrl': ['https://mp5.website.net/storage1/M03/10/92/aPODC10sfP-AcFDnAGhUgdKc7iA667.mp4'], 'videoImg': ['https://mp5.website.net/storage1/M03/10/97/aPODCl0sfP-ACNFjAABmn9NL64Q064.png'], 'videoIntroduction': ['[{"content":"Everything in the world is a matrix","type":1,"userId":""}]'], 'userNickName': ['Califax']}
所以 对于您的情况,类似
output = urllib.parse.parse_qs(inputTag["value"])
您可以将元素作为字典和列表索引进行访问
print(output['videoIntroduction'][0])
[{"content":"Everything in the world is a matrix","type":1,"userId":""}]userNickName=Califax
这是一个JSON字符串,因此将其解码为字典
videoIntroduction = json.loads(output['videoIntroduction'][0])
print(videoIntroduction[0]["content"])
print(videoIntroduction[0]["type"])
可打印
Everything in the world is a matrix
1
答案 1 :(得分:1)
发布的标签似乎有点格式错误,因此我不得不对其进行修复以便对其进行解析,但是我要解释一下。价值似乎以"
开始,但随后以'
结束。另外,假设userNickName=Califax
之前缺少&
。我可能是错的,但答案的依据仍应具有针对性。
在您的示例中,找到输入并将其分配给inputTag
。 inputTag
是一个input
元素。当您使用格式符号input['key']
时,它将查找名称为key
的HTML属性。您要访问的是value
。 value
的内容是一个非常大的字符串,具有由&
分隔的键值对。 BeautifulSoup不知道如何存储任意数据,它只是返回所需属性的值,在您的情况下,该属性是一个很大的字符串。我们必须解析这些数据,因为BeautifulSoup不知道该怎么做。
在这种情况下,我们可以简单地删除第一个&
,然后将数据除以&
。然后,我们可以拆分第一个=
返回的每个项目。这将为我们提供[(key1, value1), (key2, value2), ...]
的结构。这是创建词典的理想选择,因为它需要它的格式。因此,我们可以调用dict
来发送其结构。
此后,我们有了一个字典,该字典的键等于HTML属性value
中的每个键。我们可以简单地访问所需的密钥:
from bs4 import BeautifulSoup
html = """
<input type="text" style="display: none" id="videoId" value='&videoId=139209&videoUrl=https://mp5.website.net/storage1/M03/10/92/aPODC10sfP-AcFDnAGhUgdKc7iA667.mp4&videoImg=https://mp5.website.net/storage1/M03/10/97/aPODCl0sfP-ACNFjAABmn9NL64Q064.png&videoIntroduction=[{"content":"Everything in the world is a matrix","type":1,"userId":""}]&userNickName=Califax'>
"""
soup = BeautifulSoup(html, features="html.parser")
inputTag = soup.find("input", {"id": "videoId"})
output = inputTag["value"]
values = dict([x.split('=', 1) for x in output.lstrip('&').split('&')])
print('=== Values ===')
print(values)
print('=== Wanted videoUrl ===')
print(values['videoUrl'])
输出
=== Values ===
{'videoId': '139209', 'videoUrl': 'https://mp5.website.net/storage1/M03/10/92/aPODC10sfP-AcFDnAGhUgdKc7iA667.mp4', 'videoImg': 'https://mp5.website.net/storage1/M03/10/97/aPODCl0sfP-ACNFjAABmn9NL64Q064.png', 'videoIntroduction': '[{"content":"Everything in the world is a matrix","type":1,"userId":""}]', 'userNickName': 'Califax'}
=== Wanted videoUrl ===
https://mp5.website.net/storage1/M03/10/92/aPODC10sfP-AcFDnAGhUgdKc7iA667.mp4