使用以下代码,我可以毫无问题地获取“汤”。我的目标是最终在汤对象中获取标题,但我无法弄清楚如何做到这一点。除了下面,我还尝试了各种迭代的汤['结果'],汤。结果,汤.get_text()。结果等等,并不知道如何到达它。当然,我可以做一些soup.get_text()...(字符串“title”的某种搜索功能,但感觉必须有一个内置的方法。
55)get_title()
54 ipdb.set_trace()
---> 55 title = soup.html.head.title.string
56 title = re.sub(r'[^\x00-\x7F]+',' ', title)
ipdb> type(soup)
<class 'bs4.BeautifulSoup'>
ipdb> soup.title
ipdb> print soup.title
None
ipdb> soup
{"status":"OK","copyright":"Copyright (c) 2018 The New York Times Company. All Rights Reserved.","section":"home","last_updated":"2018-01-07T06:19:00-05:00","num_results":42,"results":[{"section":"Briefing","subsection":"",**"title":"Trump, Palestinians, Golden Globes: Your Weekend Briefing"**, ....
代码
from __future__ import division
import regex as re
import string
import urllib2
from bs4 import BeautifulSoup
from cookielib import CookieJar
import ipdb
PARSER_TYPE = 'html.parser'
def get_title(url):
cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
p = opener.open(url)
soup = BeautifulSoup(p.read(), PARSER_TYPE) # This loads fine
ipdb.set_trace()
title = soup.html.head.title.string # This is sad
title = re.sub(r'[^\x00-\x7F]+',' ', title)
return title
答案 0 :(得分:2)
看看p.read()
返回的内容。你会发现它不是HTML,它是一个JSON字符串。您无法使用HTML解析器成功解析JSON,但是,您可以使用JSON解析器,例如json
包中提供的解析器。
import json
p = opener.open(url)
response = json.loads(p.read())
遵循此response
将引用字典。然后,您可以使用字典访问方法来提取特定数据:
title = response['results'][0]['title']
请注意,response['results']
本身就是list
,因此您需要获取该列表的第一个元素(至少对于您已经显示的示例)。 response['results'][0]
然后给出第二个嵌套字典,其中包含您想要的数据。用title
键查找。
由于结果包含在列表中,您可能需要迭代该列表以处理每个结果:
for result in response['results']:
print(result['title'])
如果某些结果没有标题键,您可以使用dict.get()
执行查找而不会引发异常:
for result in response['results']:
print(result.get('title'))