AttributeError: 'NavigableString'对象没有' find_all'属性 (NameError)

2 投票
2 回答
10460 浏览
提问于 2025-04-18 18:56
import requests
from bs4 import BeautifulSoup
url=("http://finance.naver.com/news/mainnews.nhn")

r=requests.get(url)
soup=BeautifulSoup(r.content)

a_data = soup.find_all("li",{"class":"block1"})

for item in a_data:
    print item.contents[0].find_all("dt",{"class":"articleSubject"})[0].text
<li class="block1">
<dl>
<dt class="articleSubject">
<span class="remark"></span> <!-- 말머리는 span class="remark" 로 묶임 -->
<a href="/news/news_read.nhn?       
article_id=0003289339&amp;office_id=009&amp;mode=mainnews&amp;type=&amp;date=2014-08-   
27&amp;page=1">**시총 9조 `모바일 공룡` 다음카카오 합병 승인…업계 지각변동 예고**</a>
</dt>
<dd class="articleSummary">
다음카카오가 합병을 위한 마지막 문턱을 넘어섰다. 네이버의 독주가 지속되고 있는 온라인·모바일 업계에    
적지 않은 시장 판도 변화가 예상된다.   27일 다음과 카카오는 각각 제주 ..
                                    <span class="press">매일경제 </span>
<span class="bar">|</span>
<span class="wdate">2014-08-27 11:40:05</span>
</dd>
</dl>
</li>

在这段代码中,当我运行它的时候,出现了这样的错误:
“AttributeError: 'NavigableString'对象没有'find_all'这个属性”。

我该怎么解决这个问题呢???
我已经尝试过使用try和except的方法,但还是不行...

// 这是HTML代码

2 个回答

0

我建议你在循环中把可导航字符串和标签分开处理。首先:

import NavigableString

然后在你的循环中,检查汤里的所有元素,看看它们是标签还是可导航字符串,可以用:

if isinstance(object, NavigableString):
    Do something with this event
else:
    Do something with thing that is not NavigableString
1

如果你想找到和 dt 标签中 class 属性为 articleSubject 相关的文本,你可以直接在 item 里面找到它。

你可以这样做:

>>> for item in a_data:
...     print item.find_all("dt",{"class":"articleSubject"})[0].text

这样会输出:

**시총 9조 `모바일 공룡` 다음카카오 합병 승인…업계 지각변동 예고**

对于上面的 HTML 来说。如果你把这段代码运行在你代码里的网址上,你会得到 20 个结果。

item.contents 是一个列表,列表的第一个元素是 \n(换行符)。所以在换行符上使用 find_all() 会导致出现 AttributeError 错误。

撰写回答