【问题标题】:Extracting tag from bs4.element.tag returns empty string从 bs4.element.tag 中提取标签返回空字符串
【发布时间】: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 一样的错误

标签: python html json beautifulsoup


【解决方案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'>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2018-10-01
    • 2013-08-01
    相关资源
    最近更新 更多