提取嵌入在网页代码中的JSON



我最近一直在尝试一些网络刮擦解决方案。

我正在尝试提取网页中嵌入JSON代码的特定元素(https://www.instagram.com/p/bxiii02-a9wb/(。

我有兴趣隔离文本和作者详细信息的评论部分详细信息:

"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()

基本上,我想访问诸如评论之类的信息,

" Pior Operadora de Semper,Nunca VI UMA Internet T U00E3O Lenta Como A Vossa,Fico Feliz em dizer em dizer que que que que que que quando contato contato acabar vou mudar para a vodafone a vodafone, u00e9 mais barato e tem tem tem tem tem tem tem tem uma de n n n n n n n n n n im u u u y u u00ednimo10 Vezes Melhor。

以及作者手持"@filipe389"。

在我在此处发布的示例中,我在返回时会得到"评论",而我使用时" t" results.append(数据[6](

任何提示或建议都将受到欢迎!

谢谢!

Miguel

如上所述,无需迭代。但是,如果您要在字典上添加并需要键和值,则需要使用.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)

最新更新