我想构建一个正则表达式来查找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)
答案 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运算符|
分隔。