【问题标题】:Decomposing HTML to link text and target分解 HTML 以链接文本和目标
【发布时间】:2010-09-22 02:31:32
【问题描述】:

给定一个 HTML 链接,例如

<a href="urltxt" class="someclass" close="true">texttxt</a>

如何隔离 url 和文本?

更新

我正在使用 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')]*  ...
...

为什么我错过了内容?

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

【问题讨论】:

  • 可能是 urllib.urlopen(url) 有问题。试着把它打印出来,看看你得到了什么。它应该是网页的直接 HTML。
  • 还有,“卡住了!”不是很具有描述性。显示更多代码以及到底出了什么问题。
  • 感谢您提供的额外信息,它让您更容易看到发生了什么。

标签: python html regex beautifulsoup


【解决方案1】:

使用Beautiful Soup。自己做比看起来更难,最好使用久经考验的模块。

编辑:

我想你想要:

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

顺便说一句,尝试在那里打开 URL 是个坏主意,因为如果它出错可能会变得丑陋。

编辑 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

【讨论】:

  • 我同意,Beatiful Soup 可能是更好的处理方法。
  • 在别处打开网址并检查那里的错误会更好吗?
  • 是的,试一试...除了它周围,以防万一失败。
  • 字符串前面的 'u' 表示它是 Unicode。请参阅维基百科了解这意味着什么。它应该不会对您造成太大影响。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    看起来你有两个问题:

    1. link.contents,而不是 link.content
    2. attrs 是字典,而不是字符串。它保存 HTML 元素中每个属性的键值对。 link.attrs['href'] 会得到你想要的东西,但是如果你遇到没有 href 属性的 a 标签,你会想把它包装在一个检查中。

    【讨论】:

      【解决方案4】:

      虽然我认为其他人可能正确地指出您使用 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”),我只需在其上运行另一个正则表达式以去除尖括号之间的任何内容。

      【讨论】:

      • 使用这种方法,您需要注意源代码中的换行符。确保在编译模式时设置标志 re.DOTALL。
      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 2013-07-22
      • 2017-02-03
      相关资源
      最近更新 更多