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

时间:2019-05-17 13:01:37

标签: python json

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

我正在尝试提取嵌入在网页(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()

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

“ Pior Operadora de sempre,互联网服务,Fico feliz em izer quaquan o与acabar vou mudar para vodafone,\ u00e9 mais barato e tem uma qualidade de net no m \ u00 10 vezes melhor。推荐一个vodafone ou到\ u00e9 mesmo a meo que pode \ u00e3o ser perfeita mas semper \ u00e9 melhor que a NOS(o que n \ u00e3o \ u00e9 dif \ u00edcil)“,

以及作者句柄名称“ @ filipe389”。

在我在此处发布的示例中,当我使用时,返回的只是“注释”,而返回的却是“ t”     results.append(data [6])

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

谢谢!

米格尔

1 个答案:

答案 0 :(得分:0)

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