使用漂亮的汤4在<p class =“postbody”>标签内刮取URL并将其保存到文本文件</p>

时间:2014-08-13 03:23:54

标签: python html beautifulsoup html-parsing

我意识到这可能非常简单,但请耐心等待。我正在尝试使用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 :(得分:4)

错误的实际原因是snippetfind_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'):

此处snippetbs4.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")