如何使用正则表达式获取html

时间:2012-01-16 15:41:58

标签: python regex

#<link rel='canonical' href='http://www.samplewebsite.com/image/5434553/' />

#I am trying to grab the text in href

image = str(Soup)

image_re = re.compile('\<link rel=\'cononical\' href=')

image_pat = re.findall(image_re, image)

print image_pa

#>> []

#Thanks!

5 个答案:

答案 0 :(得分:5)

编辑:这使用了BeautifulSoup包,我认为我在此问题的上一版本中看到过。

编辑:更直接的是:

soup = BeautifulSoup(document)
links = soup.findAll('link', rel='canonical')
for link in links:
    print link['href']

而不是所有这些,您可以使用:

soup = BeautifulSoup(document)
links = soup("link")
for link in links:
    if "rel" in link and link["rel"] == 'canonical':
        print link["href"]

答案 1 :(得分:0)

使用两个正则表达式:

import re
link_tag_re = re.compile(r'(<link[^>]*>')
# capture all link tags in your text with it. Then for each of those, use:
href_capture = re.compile(r'href\s*=\s*(\'[^\']*\'|"[^"]*")')

第一个正则表达式将捕获整个<link>标记;第二个将查找href="something"href='something'

但是,一般情况下,您应该使用HTML解析器来处理HTML,即使这个问题是完全常规的语言问题。它们更容易用于此类事情,并且不太可能导致您出现问题。

答案 2 :(得分:0)

您应该使用lxml.htmlBeautifulSoup等HTML解析器。但是,如果你只想抓住一个href的{​​{1}},你也可以使用一个简单的正则表达式:

link

答案 3 :(得分:0)

你最好在数据上使用正确的HTML解析器,但如果你真的想沿着这条路走下去,那么下面就会这样做:

>>> data = "... <link rel='canonical' href='http://www.samplewebsite.com/image/5434553/' /> ..."
>>>
>>> re.search("<link[^>]+?rel='canonical'[^>]+?href='([^']+)", x).group(1)
'http://www.samplewebsite.com/image/5434553/'
>>>

我还注意到您的HTML使用单引号而不是双引号。

答案 4 :(得分:0)

这将是匹配您给出的示例html的正则表达式:

<link rel='canonical' href='(\S+)'

但我不确定正则表达式是否是正确的工具。使用双引号(或无引号)时,此正则表达式将失败。或者如果转向rel和href。

我建议使用类似BeautifulSoup的内容来查找和收集所有相关的规范href值。