查找字符串

时间:2015-05-19 16:04:55

标签: python html regex beautifulsoup lxml

我想在字符串中找到所有网址。我发现StackOverflow上的各种解决方案因字符串的内容而异。

例如,假设我的字符串包含HTML,this answer建议使用BeautifulSouplxml

另一方面,如果我的字符串只包含没有HTML标记的普通网址,this answer建议使用正则表达式。

鉴于我的字符串包含HTML编码的URL和普通的URL,我无法找到一个好的解决方案。以下是一些示例代码:

import lxml.html

example_data = """<a href="http://www.some-random-domain.com/abc123/def.html">Click Me!</a>
http://www.another-random-domain.com/xyz.html"""
dom = lxml.html.fromstring(example_data)
for link in dom.xpath('//a/@href'):
    print "Found Link: ", link

正如所料,这导致:

Found Link:  http://www.some-random-domain.com/abc123/def.html

我还尝试了@Yannisp提到的twitter-text-python库,但它似乎没有提取这两个URL:

>>> from ttp.ttp import Parser
>>> p = Parser()
>>> r = p.parse(example_data)
>>> r.urls
['http://www.another-random-domain.com/xyz.html']

从包含HTML和非HTML编码数据混合的字符串中提取两种URL的最佳方法是什么?有没有一个好的模块已经做到了这一点?或者我被强制将正则表达式与BeautifulSoup / lxml组合在一起?

3 个答案:

答案 0 :(得分:1)

我投了赞成票,因为它引发了我的好奇心。似乎有一个名为twitter-text-python的库,它解析Twitter帖子以检测网址和href。否则,我会使用组合regex + lxml

答案 1 :(得分:0)

您可以使用RE查找所有网址:

import re
urls = re.findall("(https?://[\w\/\$\-\_\.\+\!\*\'\(\)]+)", example_data)

包括字母数字,'/'和"Characters allowed in a URL"

答案 2 :(得分:0)

根据@YannisP的回答,我能够提出这个解决方案:

import lxml.html  
from ttp.ttp import Parser

def extract_urls(data):
    urls = set()
    # First extract HTML-encoded URLs
    dom = lxml.html.fromstring(data)
    for link in dom.xpath('//a/@href'):
        urls.add(link)
    # Next, extract URLs from plain text
    parser = Parser()
    results = parser.parse(data)
    for url in results.urls:
        urls.add(url)
    return list(urls)

这导致:

>>> example_data
'<a href="http://www.some-random-domain.com/abc123/def.html">Click Me!</a>\nhttp://www.another-random-domain.com/xyz.html'
>>> urls = extract_urls(example_data)
>>> print urls
['http://www.another-random-domain.com/xyz.html', 'http://www.some-random-domain.com/abc123/def.html']

我不确定这对其他网址有多好,但它似乎适用于我需要它做的事情。