Python 使用Beauty soup 4在标记中刮取URL并将其保存到文本文件中

Python 使用Beauty soup 4在标记中刮取URL并将其保存到文本文件中,python,html,beautifulsoup,html-parsing,Python,Html,Beautifulsoup,Html Parsing,我意识到这可能非常简单,但请容忍我。我正在尝试使用Beautifulsoup4来抓取一个网站,该网站有一个博客帖子列表,其中包含这些帖子的URL。我想要的标签在标签中。有多个标签,其中包括一个标题,然后是我想要捕获的链接。这是我正在使用的代码: with io.open('TPNurls.txt', 'a', encoding='utf8') as logfile: snippet = soup.find_all('p', class="postbody") for link in

我意识到这可能非常简单,但请容忍我。我正在尝试使用Beautifulsoup4来抓取一个网站,该网站有一个博客帖子列表,其中包含这些帖子的URL。我想要的标签在标签中。有多个标签,其中包括一个标题,然后是我想要捕获的链接。这是我正在使用的代码:

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不允许我在集合中查找标签。但那我怎么做呢?我需要它找到整个标记集,然后在每个标记中查找标记,然后将每个标记保存在单独的一行中到一个文件中。

错误的实际原因是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_uhere的用法-class是一个保留关键字,不能在这里用作关键字参数。有关更多信息,请参阅

或者,利用:


p、 postbody a会将p标记内的所有a标记与类postbody匹配。

错误的实际原因是代码段是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_uhere的用法-class是一个保留关键字,不能在这里用作关键字参数。有关更多信息,请参阅

或者,利用:

p、 postbody a将p标记内的所有a标记与类postbody匹配。

在代码中

snippet = soup.find_all('p', class="postbody")
for link in snippet.find('a'):
这里的代码段是一个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")
在代码中

snippet = soup.find_all('p', class="postbody")
for link in snippet.find('a'):
这里的代码段是一个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")

FWIW,snippet=soup。find'p',postbody'也将匹配class=postbody的标记。_类的使用是显式的,这比隐式的要好,所以可能更好。@mhawke是的,而soup.find'p',attrs={'class':'postbody'}更显式:谢谢你的帮助,但它仍然会给我一个结果集错误。@JolijtTamanaha你正在使用的代码有smth,你能发布你现在的完整代码吗?包括在问题中谢谢。嗨,谢谢你们两位的帮助,我最后简化了它,在不同的标记中查找相同的链接,但使用了更显式的代码,它工作了fwiw,snippet=soup。find'p',postbody'也将标记与class=postbody匹配。_类的使用是显式的,这比隐式的要好,所以可能更好。@mhawke是的,而soup.find'p',attrs={'class':'postbody'}更显式:谢谢你的帮助,但它仍然会给我一个结果集错误。@JolijtTamanaha你正在使用的代码有smth,你能发布你现在的完整代码吗?谢谢。嗨,谢谢你们的帮助,我通过在不同的标记中查找相同的链接来简化它,但使用了您更明确的代码,并且成功了。您能提供一些输入数据吗?您好,谢谢您的帮助,但我通过在不同的标记中查找相同的链接来简化它。您能提供一些输入数据吗?您好,谢谢您的帮助,但我最终简化了它通过在不同的标记中查找相同的链接。