python - 从网站提取文本时出错:AttributeError 'NoneType' 对象没有属性 'get_text'
问题描述
我正在抓取这个网站并使用 .get_text().strip()
.
我在使用相同的方法将“作者”提取为文本时遇到问题。
data2 = {
'url' : [],
'title' : [],
'category': [],
'author': [],
}
url_pattern = "https://www.nature.com/nature/articles?searchType=journalSearch&sort=PubDate&year=2018&page={}"
count_min = 1
count_max = 3
while count_min <= count_max:
print (count_min)
url = url_pattern.format(count_min)
r = requests.get(url)
try:
soup = BeautifulSoup(r.content, 'lxml')
for links in soup.find_all('article'):
data2['url'].append(links.a.attrs['href'])
data2['title'].append(links.h3.get_text().strip())
data2["category"].append(links.span.get_text().strip())
data2["author"].append(links.find('span', {"itemprop": "name"}).get_text().strip()) #??????
except Exception as exc:
print(exc.__class__.__name__, exc)
time.sleep(0.1)
count_min = count_min + 1
print ("Fertig.")
df = pd.DataFrame( data2 )
df
df
应该打印一个带有“author”、“category”、“title”、“url”的表格。打印异常给了我以下提示:AttributeError 'NoneType' object has no attribute 'get_text'
. 但我收到以下消息,而不是表格。
ValueError Traceback (most recent call last)
<ipython-input-34-9bfb92af1135> in <module>()
29
30 print ("Fertig.")
---> 31 df = pd.DataFrame( data2 )
32 df
~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in __init__(self, data, index, columns, dtype, copy)
328 dtype=dtype, copy=copy)
329 elif isinstance(data, dict):
--> 330 mgr = self._init_dict(data, index, columns, dtype=dtype)
331 elif isinstance(data, ma.MaskedArray):
332 import numpy.ma.mrecords as mrecords
~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in _init_dict(self, data, index, columns, dtype)
459 arrays = [data[k] for k in keys]
460
--> 461 return _arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
462
463 def _init_ndarray(self, values, index, columns, dtype=None, copy=False):
~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in _arrays_to_mgr(arrays, arr_names, index, columns, dtype)
6161 # figure out the index, if necessary
6162 if index is None:
-> 6163 index = extract_index(arrays)
6164 else:
6165 index = _ensure_index(index)
~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in extract_index(data)
6209 lengths = list(set(raw_lengths))
6210 if len(lengths) > 1:
-> 6211 raise ValueError('arrays must all be same length')
6212
6213 if have_dicts:
ValueError: arrays must all be same length
如何改进我的代码以提取“作者”姓名?
解决方案
你非常接近——我推荐几件事。首先,我建议仔细查看 HTML——在这种情况下,作者姓名实际上是在 a 中ul
,其中每个都li
包含一个span
where itemprop
is 'name'
。但是,并非所有文章都具有任何作者姓名。在这种情况下,使用您当前的代码,调用links.find('div', {'itemprop': 'name'})
返回None
。None
,当然,没有属性get_text
。这意味着该行将抛出一个错误,在这种情况下只会导致没有值被附加到data2
'author'
列表中。我建议将作者存储在这样的列表中:
authors = []
ul = links.find('ul', itemprop='creator')
for author in ul.find_all('span', itemprop='name'):
authors.append(author.text.strip())
data2['authors'].append(authors)
这处理了没有作者的情况,正如我们所期望的那样,“作者”是一个空列表。
作为旁注,将您的代码放入
try:
...
except:
pass
由于您现在看到的原因,construct 通常被认为是不好的做法。默默地忽略错误可以使您的程序看起来正常运行,而实际上任何数量的事情都可能出错。至少将错误信息打印到stdout
. 即使只是做这样的事情总比没有好:
try:
...
except Exception as exc:
print(exc.__class__.__name__, exc)
然而,对于调试而言,通常也需要完整的回溯。为此,您可以使用该traceback
模块。
import traceback
try:
...
except:
traceback.print_exc()
推荐阅读
- html - 图像似乎有边距,但 DevTools 说它没有
- python-3.x - 如何使用随机组合不同的短语python
- swift - 如何确定未创建临时文件的原因?
- c# - C#和VB.NET中的Split方法
- javascript - 单击按钮时使用 HTML/CSS/JavaScript 更改段落中特定单词的属性?
- html - 键盘弹出时向上推离子页脚
- javascript - innerHTML 返回不同的内容 Angular 9
- python - 如何让我的程序打开并读取 excel 数据以保存我正在定位的数据
- javascript - JavaScript 避免在 position:fixed 后重置到页面顶部
- javascript - ER_PARSE_ERROR:您在使用 Knexjs 和 MySQL 的 Node 中的 SQL 语法有错误