使用BeautifulSoup从网页中提取绝对链接

4 投票
4 回答
3086 浏览
提问于 2025-04-15 20:45

我正在使用BeautifulSoup读取网页内容。我想要做的是抓取所有以http://开头的<a href>链接。我知道在BeautifulSoup中可以通过属性来搜索。我想我只是遇到了语法问题。我想它应该是这样的:

page = urllib2.urlopen("http://www.linkpages.com")
soup = BeautifulSoup(page)
for link in soup.findAll('a'):
    if link['href'].startswith('http://'):
        print links 

但是这样返回的是:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Python26\lib\BeautifulSoup.py", line 598, in __getitem__
    return self._getAttrMap()[key]
KeyError: 'href'

有什么想法吗?提前谢谢你。

编辑 这不是针对任何特定网站。这个脚本是从用户那里获取网址的。所以内部链接的目标会是个问题,这也是我只想要页面中的<'a'>的原因。如果我把它指向www.reddit.com,它会解析出开始的链接,然后得到这个:

<a href="http://www.reddit.com/top/">top</a>
<a href="http://www.reddit.com/saved/">saved</a>
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Python26\lib\BeautifulSoup.py", line 598, in __getitem__
    return self._getAttrMap()[key]
KeyError: 'href'

4 个回答

0

请告诉我们你在解析什么内容——正如Andrew所提到的,似乎有一些链接标签(anchor tags)没有对应的链接地址(href)。

如果你真的想忽略这些没有链接的标签,可以把相关代码放在一个“尝试”块里,然后用下面的方式来处理:

except KeyError: pass

不过,这样做也会有一些问题。

1

你有没有一些 <a> 标签没有 href 属性呢?可能是内部链接的目标吧?

6

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种时候,我们可以去一些技术论坛,比如StackOverflow,去寻找解决方案或者向其他人提问。

在这些论坛上,很多人会分享他们的经验和解决方法,帮助其他人解决类似的问题。你可以看到很多不同的回答,有的可能很简单,有的可能比较复杂,但总的来说,大家都是希望能够互相帮助。

如果你在论坛上提问,记得描述清楚你遇到的问题,提供一些相关的代码和错误信息,这样其他人才能更好地理解你的情况,给出有效的建议。

总之,技术论坛是一个很好的资源,可以帮助你解决编程中的各种问题,记得多去看看哦!

from BeautifulSoup import BeautifulSoup
import re
import urllib2

page = urllib2.urlopen("http://www.linkpages.com")
soup = BeautifulSoup(page)
for link in soup.findAll('a', attrs={'href': re.compile("^http://")}):
    print link

撰写回答