提取网页中嵌入的JSON

2024-10-04 05:21:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近一直在尝试一些网页抓取解决方案

我试图提取嵌入网页(https://www.instagram.com/p/BxII02-A9wb/)中的JSON代码的特定元素

我感兴趣的是将评论部分的细节与文本和作者细节分离开来:

"comment":[  
    {  
     "@type":"Comment",
     "text":"Pior operadora de sempre, nunca vi uma internet t\\u00e3o lenta como a vossa, fico feliz em dizer que quando o contrato acabar vou mudar para a Vodafone, \\u00e9 mais barato e tem uma qualidade de net no m\\u00ednimo 10 vezes melhor. Recomendo a todos a vodafone ou at\\u00e9 mesmo a MEO que pode n\\u00e3o ser perfeita mas sempre \\u00e9 melhor que a NOS( o que n\\u00e3o \\u00e9 dif\\u00edcil)",
     "author":{  
        "@type":"Person",
        "alternateName":"@filipe389",
        "mainEntityofPage":{  
           "@type":"ProfilePage",
           "@id":"https:\\/\\/www.instagram.com\\/filipe389\\/"
        }
     }
  }

]

我使用BeautifulSoup和Selenium来执行抓取任务,并使用json.loads来处理json部分(在隔离它之后)。但是当我试图访问评论部分的内容时,我无法访问我想要的数据:

for data in jsonData:
    if data == "comment":
    results.append(data) #also tried results.append(data[6]) and results.append(data['comment')

我认为我的问题是我处理的是字符串而不是字典,但到目前为止,我还没有找到一个有效的解决方案

我也在尝试应用正则表达式,但到目前为止还没有找到任何可行的解决方案

这是我的密码:

from selenium import webdriver
from bs4 import BeautifulSoup
import time
import json

url = "https://www.instagram.com/p/BxII02-A9wb/"
browser = webdriver.Chrome()
browser.get(url)
time.sleep(5)

html = browser.page_source
soup = BeautifulSoup(html, 'lxml')
insta_data = soup.find_all("script", type="application/ld+json")

for contents in insta_data:
    contents.text

jsonData = json.loads(contents.text) 

results = []
for data in jsonData:
    if data == "comment":
        results.append(data)

print(results)
browser.close()

基本上我想访问信息,比如评论itsef

“在sempre歌剧院,我们的互联网是一个很好的选择,它与沃达丰的音乐有着天壤之别,它是一个很好的选择。”。建议沃达丰的todos ou,以确保其性能符合以下要求(请参见第4部分)

以及作者handlename“@filipe389”

在我在这里发布的示例中,返回时只得到“comment”,使用时得到“t” 结果。追加(数据[6])

欢迎任何提示或建议

谢谢

米格尔


Tags: httpsimportbrowsercomjsondatawwwtype
1条回答
网友
1楼 · 发布于 2024-10-04 05:21:42

如上所述,不需要迭代。但是,如果您正在通过字典创建,并且同时需要键和值,则需要使用.items()

我不想重复,只是想向您展示您的代码:

from selenium import webdriver
from bs4 import BeautifulSoup
import time
import json

url = "https://www.instagram.com/p/BxII02-A9wb/"
browser = webdriver.Chrome('C:/chromedriver_win32/chromedriver.exe')
browser.get(url)
time.sleep(5)

html = browser.page_source
soup = BeautifulSoup(html, 'lxml')
insta_data = soup.find_all("script", type="application/ld+json")

results = []
for contents in insta_data:
    jsonData = json.loads(contents.text) 

    for key, value in jsonData.items():
        if key == "comment":
            results.append(value)

author = results[0][0]['author']['alternateName']
text = results[0][0]['text']

print ('%s:\n%s' %(author, text))

browser.close()

由于json/dictionary具备您所需的功能,只需使用数据结构的键和索引直接调用您所需的功能:

insta_data = soup.find_all("script", type="application/ld+json")[0]
jsonData = json.loads(insta_data.text) 

author = jsonData['comment'][0]['author']['alternateName']
text = jsonData['comment'][0]['text']

print ('%s:\n%s' %(author, text))

输出:

print ('%s:\n%s' %(author, text))
@filipe389:
Pior operadora de sempre, nunca vi uma internet tão lenta como a vossa, fico feliz em dizer que quando o contrato acabar vou mudar para a Vodafone, é mais barato e tem uma qualidade de net no mínimo 10 vezes melhor. Recomendo a todos a vodafone ou até mesmo a MEO que pode não ser perfeita mas sempre é melhor que a NOS( o que não é difícil)

相关问题 更多 >