使用Beautiful Soup 4抓取<p class="postbody">标签中的URL并保存到文本文件
我知道这可能听起来很简单,但请耐心听我说。我正在尝试使用beautifulsoup 4来抓取一个网站,这个网站上有一系列博客文章,我想获取这些文章的链接。我要找的标签在一个
with io.open('TPNurls.txt', 'a', encoding='utf8') as logfile:
snippet = soup.find_all('p', class="postbody")
for link in snippet.find('a'):
fulllink = link.get('href')
logfile.write(fulllink + "\n")
我遇到的错误是:
AttributeError: 'ResultSet'对象没有'find'这个属性
我明白这意味着“head”是一个集合,而beautifulsoup不允许我在集合中查找标签。那么我该怎么做呢?我需要找到所有的
2 个回答
0
在你的代码中,
snippet = soup.find_all('p', class="postbody")
for link in snippet.find('a'):
这里的 snippet
是一个 bs4.element.ResultSet
类型的对象。所以你会遇到这个错误。但这个 ResultSet
对象里的元素是 bs4.element.Tag
类型的,你可以在这些元素上使用 find
方法。
把你的代码改成这样,
snippet = soup.find_all("p", { "class" : "postbody" })
for link in snippet:
if link.find('a'):
fulllink = link.a['href']
logfile.write(fulllink + "\n")
4
这个错误的真正原因是,snippet
是通过 find_all()
函数得到的结果,实际上它是一个结果列表,所以上面没有 find()
这个函数可以用。你应该用的是:
snippet = soup.find('p', class_="postbody")
for link in snippet.find_all('a'):
fulllink = link.get('href')
logfile.write(fulllink + "\n")
另外,注意这里使用了 class_
,因为 class
是一个保留字,不能作为关键字参数使用。想了解更多,可以查看 通过 CSS 类进行搜索。
另外,你也可以使用 CSS 选择器
:
for link in snippet.select('p.postbody a'):
fulllink = link.get('href')
logfile.write(fulllink + "\n")
p.postbody a
这个选择器会匹配所有在 p
标签中,且类名为 postbody
的 a
标签。