从“&”之后提取值:value =“&videoId = 139209&videoUrl = https://mp5.website.net

时间:2019-08-30 23:14:17

标签: python python-3.x beautifulsoup

我有这些不同的链接,每个链接都包含不同的内容,我试图从这些链接中获取数据。

我在某种程度上取得了成功,但现在我陷入困境,正在寻求帮助以更好地理解《美丽汤》。

文档在这件事上对我没有多大帮助,没有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)

2 个答案:

答案 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之前缺少&。我可能是错的,但答案的依据仍应具有针对性。

在您的示例中,找到输入并将其分配给inputTaginputTag是一个input元素。当您使用格式符号input['key']时,它将查找名称为key的HTML属性。您要访问的是valuevalue的内容是一个非常大的字符串,具有由&分隔的键值对。 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