如何使用Python的BeautifulSoup查找和修改Html链接

1 投票
1 回答
2765 浏览
提问于 2025-04-15 23:06

从这样的Html输入开始:

<p>
<a href="http://www.foo.com">this if foo</a>
<a href="http://www.bar.com">this if bar</a>
</p>

我想用BeautifulSoup把这个Html改成:

<p>
<a href="http://www.foo.com">this if foo[1]</a>
<a href="http://www.bar.com">this if bar[2]</a>
</p>

并把解析出来的链接保存在一个字典里,结果像这样:

links_dict = {"1":"http://www.foo.com","2":"http://www.bar.com"}

用BeautifulSoup可以做到吗?有没有其他有效的替代方法?

1 个回答

4

在使用Beautiful Soup的时候,这个应该很简单。

可以这样做:

from BeautifulSoup import BeautifulSoup
from BeautifulSoup import Tag

count = 1
links_dict = {}
soup = BeautifulSoup(text)
for link_tag in soup.findAll('a'):
  if link_tag['href'] and len(link_tag['href']) > 0:
    links_dict[count]  = link_tag['href']  
    newTag = Tag(soup, "a", link_tag.attrs)
    newTag.insert(0, ''.join([''.join(link_tag.contents), "[%s]" % str(count)]))
    link_tag.replaceWith(newTag)
    count += 1

在你的文本上执行这个代码后的结果是:

>>> soup
<p>
  <a href="http://www.foo.com">this if foo[1]</a>
  <a href="http://www.bar.com">this if bar[2]</a>
</p>

>>> links_dict
{1: u'http://www.foo.com', 2: u'http://www.bar.com'}

我能想到的唯一问题是,如果你的链接文本里面有子标签,那你就不能直接用 ''.join(link_tag.contents) 了;相反,你需要找到最右边的文本元素。

撰写回答