用Python检查同一域名的URL是否在列表中存在?
我写了一个脚本,用来检查输入的链接是否在某个特定标签的外部链接列表中。我的目标是确认输入的链接是否存在于这个外部链接列表里。接下来我做了以下操作:
from lxml import html
import urllib2
url = 'http://businessinsider.com/'
Testurl = urllib2.urlopen('somequerryurl' +url).read()
tree = html.fromstring(Testurl)
#this check if specific <li class=""> id tag exists
Elements = tree.xpath('//div[@id="bd-cross"]//li[@class=""]')
try:
if len(Elements) > 0:
links = list(tree.xpath('//li[@class=""]//a/@href'))
if url in links:
print 'Yes'
else:
print 'No'
else:
print 'No'
except ValueError:
print 'Check your entered url!', url
比如,我有一个链接列表,其中包含了 http://www.businessinsider.com/2007/11/blablabla 和 http://www.businessinsider.com/2012/news/blablaba。我的脚本返回了'没有',因为根据脚本的判断,这个链接不在列表中,但其实应该返回'有'。那么,检查一个属于同一个域名的链接是否在列表中,以便得到正确结果的最佳方法是什么呢?
3 个回答
0
要安装一个叫做 tldextract 的库,你可以在命令行中输入这个命令:pip install tldextract。这个库可以帮助你从网址中提取出顶级域名,比如从 "www.example.com" 中提取出 ".com"。
import tldextract
my_main_url = "https://cnn.com"
domainname = tldextract.extract(my_main_url)[1] # "cnn"
raw_links = driver.find_elements(By.XPATH, '//a [@href]')
for link in raw_links:
l = link.get_attribute("href")
if str(tldextract.extract(l)[1]) == domainname: #if link matches cnn
print("this link's domain matches my_main_url: {}".format(l))
2
你的 url
是 http://businessinsider.com/
,但这个地址并不在你得到的链接中,链接里包含的是 http://www.businessinsider.com/
。
你需要查找的是域名本身:
>>> 'businessinsider.com' in 'http://www.businessinsider.com/foo/bar/zoo'
True
为了避免写死这个域名,你可以解析出域名的部分:
from urllib2 import urlparse
url = 'http://businessinsider.com/'
search_domain = urlparse.urlparse(url).hostname
if search_domain in 'http://www.businessinsider.com/foo/bar/zoo':
print 'Yes'
else:
print 'No'
这里有一个进一步的例子:
>>> urls = ['http://www.businessinsider.com/hello/foo',
'http://google.com/',
'http://businessinsider.com/']
>>> search_domain = urlparse.urlparse('http://businessinsider.com/').netloc
>>> for i in urls:
... if search_domain in i:
... print "{} contains {}".format(i,search_domain)
...
http://www.businessinsider.com/hello/foo contains businessinsider.com
http://businessinsider.com/ contains businessinsider.com
1
我觉得你不需要使用 list()
函数,因为它本身就是一个列表。
你不能直接检查某个子字符串是否在列表里——你得一个一个地检查列表中的每个项目,看看这个子字符串是否在这些项目里。
你可以试试:
links = tree.xpath('//li[@class=""]//a/@href')
found = False
for link in links:
if url in link:
found = True
break
print found
你可以用更简短的方式来写:
any(url in link for link in links)
any()
函数是用来检查序列中是否有任何一个项目为真的。url in link
是一个测试,而 for link in links
是一个循环。我不太确定这是否更清楚,除非你对 Python 有一点了解。