我意识到这可能非常简单,但请耐心等待。我正在尝试使用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不让我在一个集合中寻找标签。但那我该怎么做呢?我需要它来查找整个标签集,然后在每个标签中查找标签,然后将每个标签保存在一个单独的行中。
答案 0 :(得分: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
是保留关键字,不能在此处用作关键字参数。有关详细信息,请参阅Searching by CSS class。
或者,请使用CSS selectors
:
for link in snippet.select('p.postbody a'):
fulllink = link.get('href')
logfile.write(fulllink + "\n")
p.postbody a
会将a
标记内的所有p
标记与类postbody
匹配。
答案 1 :(得分: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")