用于抓取网址的正则表达式

时间:2016-11-29 21:22:04

标签: regex

我想构建一个正则表达式来查找url

假设我的doc包含两个url案例,如下所示:

<a href="http://www.shopclues.com/phillps-lcd-18.5-193v5lsb23-94.html" class="name" target="_blank">Phillps LCD 18.5 193V5LSB23/94</a>

<a target="_blank" href="http://www.shopclues.com/privacy-policy.html">

有数千种不同的网址字符串。我只想要class="name"存在的第一个案例网址。

所以我希望网址像第一个网址:"http://www.shopclues.com/phillps-lcd-18.5-193v5lsb23-94.html"

我写了一个正则表达式,但它给了我所有第二个案例的网址。

urls = findall(r'href=[\'"]?([^\'" ]+)', text) 

4 个答案:

答案 0 :(得分:2)

import re
 a = []
r = re.compile('(?<=href=").*?(?=")(?=.*class="name")')
f = open('/****/**/output.txt','r')
for lines in f:
     if len(r.findall(lines)) > 0:
             a.append(r.findall(lines))


print a

我希望这会回答你的问题。谢谢

答案 1 :(得分:1)

你不必像单一的正则表达式一样严肃解决问题。保持简单。

import re

source = """

<a href="http://www.shopclues.com/phillps-lcd-18.5-193v5lsb23-94.html" class="name" target="_blank">Phillps LCD 18.5 193V5LSB23/94</a>

<a target="_blank" href="http://www.shopclues.com/privacy-policy.html">

"""

urls = re.compile('\<a\s[^\>]+\>', re.MULTILINE)
href = re.compile('href\=\"[^\"]+\"')

alist = re.findall(urls, source)

for anurl in alist:
    if 'class="' in anurl:
        ahref = re.findall(href, anurl)[0]
        ahref = ahref.split('"')[1]
        print ahref

答案 2 :(得分:0)

我会在这里推荐你:https://xkcd.com/1171/

并且...建议您尝试使用html解析库。 Fortunatly!大多数语言都有html解析库,可以让你使用jQuery / css选择器来获得你想要的东西。对于c#,有:https://github.com/jamietre/CsQuery

查询只是&#34; a.name&#34;,你将收回一个集合,迭代它,并获得href属性。

我已经完成了大量的网络抓取工作,像图书馆这样的jquery真正让你专注于提取你需要的数据而不是其他问题(比如制作正则表达式)。

答案 3 :(得分:0)

由于是新的,我无法发表评论,但这个正则表达似乎对我有用。我不知道python或它将如何在功能上工作,但正则表达式匹配。希望它有所帮助。

https://regex101.com/r/Jt7CED/2

^(?:<a.*href=(\S+).*class="name".*>|<a .*class="name".*href=(\S+).*>)$

此正则表达式以两种方式将网址与class="name"匹配。

首先,<a.*href=(\S+).*class="name".*>将检索class="name"属性后显示href=的网址。

其次,<a .*class="name".*href=(\S+).*将检索class="name"属性出现在href=属性之前的任何位置的网址。

第一个和第二个正则表达式模式由or / alternative运算符|分隔。