分解HTML以链接文本和目标

时间:2008-11-13 00:38:56

标签: python html regex beautifulsoup

给出像

这样的HTML链接
<a href="urltxt" class="someclass" close="true">texttxt</a>

如何隔离网址和文字?

更新

我正在使用Beautiful Soup,我无法弄清楚如何做到这一点。

我做了

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url))

links = soup.findAll('a')

for link in links:
    print "link content:", link.content," and attr:",link.attrs

我得到了

*link content: None  and attr: [(u'href', u'_redirectGeneric.asp?genericURL=/root    /support.asp')]*  ...
...

为什么我错过了内容?

编辑:按照建议详细说明'卡住':)

4 个答案:

答案 0 :(得分:8)

使用Beautiful Soup。自己做比看起来更难,你最好使用经过试验和测试的模块。

修改

我想你想要:

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url).read())

顺便说一下,尝试在那里打开网址是个坏主意,就好像它出错了它可能会变得丑陋。

编辑2:

这应该显示页面中的所有链接:

import urlparse, urllib
from BeautifulSoup import BeautifulSoup

url = "http://www.example.com/index.html"
source = urllib.urlopen(url).read()

soup = BeautifulSoup(source)

for item in soup.fetchall('a'):
    try:
        link =  urlparse.urlparse(item['href'].lower())
    except:
        # Not a valid link
        pass
    else:
        print link

答案 1 :(得分:6)

这是一个代码示例,显示了获取链接的属性和内容:

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url))
for link in soup.findAll('a'):
    print link.attrs, link.contents

答案 2 :(得分:4)

看起来你有两个问题:

  1. link.content s ,而不是link.content
  2. attrs是一个字典,而不是一个字符串。它为HTML元素中的每个属性保存键值对。 link.attrs ['href']会得到你看起来正在寻找的东西,但是如果你遇到一个没有href属性的标签,你想把它包装好。

答案 3 :(得分:3)

虽然我认为其他人可能指向你使用Beautiful Soup是正确的,但他们可能没有,并且使用外部库可能会大大超过顶部为了你的目的。这是一个正如你所要求的正则表达式。

/<a\s+[^>]*?href="([^"]*)".*?>(.*?)<\/a>/

以下是匹配的内容:

'<a href="url" close="true">text</a>'
// Parts: "url", "text"

'<a href="url" close="true">text<span>something</span></a>'
// Parts: "url", "text<span>something</span>"

如果你想只是文本(例如:上面第二个例子中的“textsomething”),我只需在它上面运行另一个正则表达式来删除尖括号之间的任何内容。