0

我写了一个脚本来解析一些在传出链接存在上输入的 url。我真正需要的是检查输入的 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。脚本给了我“不”,因为 url(基于脚本)不在链接中 - 但正确的“是”。检查列表中是否存在属于同一域的 url 以获得正确结果的最佳方法是什么?

4

2 回答 2

2

url的 ishttp://businessinsider.com/和 this 不是您返回的链接的一部分,其中包含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
于 2013-03-01T11:20:15.070 回答
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。

于 2013-03-01T10:57:08.753 回答