使用Beautiful Soup 4抓取<p class="postbody">标签中的URL并保存到文本文件

2 投票
2 回答
547 浏览
提问于 2025-04-18 17:06

我知道这可能听起来很简单,但请耐心听我说。我正在尝试使用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 标签中,且类名为 postbodya 标签。

撰写回答