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

时间:2010-05-24 21:12:58

标签: python beautifulsoup

从这样的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 个答案:

答案 0 :(得分:4)

这应该很容易在美丽的汤。

类似的东西:

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);相反,您需要导航到最右边的文本元素。