最近我一直在尝试一些网络抓取解决方案。
我正在尝试提取嵌入在网页(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])
任何提示或建议都将受到欢迎!
谢谢!
米格尔
答案 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)