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はそうです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
于 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 に答える