从 bs4.element.tag 中提取标签返回空字符串

Posted

技术标签:

【中文标题】从 bs4.element.tag 中提取标签返回空字符串【英文标题】:Extracting tag from bs4.element.tag returns empty string 【发布时间】:2021-02-27 20:34:23 【问题描述】:

我正在尝试按照教程从 Quora url 中提取所有答案。我的代码是这样的

url = 'https://www.quora.com/Should-I-move-to-London'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
answers = soup.find("script", "type": "application/ld+json")
answers

但是,当我尝试从答案(bs4.element.tag 对象)中获取文本时, 它只是显示为空。 如何提取所有答案? 我也尝试了以下

data = json.loads(soup.find('script', type='application/ld+json').text)

但我收到以下错误

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我附上一张bs4主体结构的截图

【问题讨论】:

我刚刚尝试了你的脚本和行:data = json.loads(soup.find('script', type='application/ld+json').text) 对我来说很好 我试过了..但我得到了和 OP 一样的错误 ***.com/help/someone-answers 【参考方案1】:

您必须使用.string 来获取对象。

方法如下:

import json

import requests
from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get('https://www.quora.com/Should-I-move-to-London').content, 'html.parser')
answers = soup.find("script", "type": "application/ld+json")
data = json.loads(answers.string)
print(data["mainEntity"]["answerCount"])

例如,打印:

12

要打印答案,请使用:

for number, answer in enumerate(data["mainEntity"]["suggestedAnswer"], start=1):
    print(f"Answer: number. | Upvote count: answer['upvoteCount']")
    print(answer["text"].strip())
    print("-" * 80)

【讨论】:

这与我的回答不同吗?你要添加什么? 看看谁先发布了答案。 :-] 如何打印问题的答案? @AbrarAhmed 我已经更新了答案。 现在答案已经完成了。【参考方案2】:

你需要调用.string方法:

import json
import requests
from bs4 import BeautifulSoup

url = 'https://www.quora.com/Should-I-move-to-London'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
answers = soup.find("script", "type": "application/ld+json")

json_data = json.loads(answers.string)
>>> print(type(json_data))
<class 'dict'>

【讨论】:

以上是关于从 bs4.element.tag 中提取标签返回空字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python BS4.element.tag如何对此执行click()

isinstance

name方法可以获取及修改Tag对象名称

如何将 BeautifulSoup 标签转换为 JSON?

Python爬虫编程思想(56):Beautiful Soup方法选择器之find方法

Python元素树 - 从元素中提取文本,剥离标签