2016-05-04 7 views
1

は、私は、クエリsoup.find_all("li", {"class" : "first_result"})なぜ美しいスープは複数のクラスでこの要素を見つけられないのですか?

要素は、ページ上の間違いであるを使用して<li class="result first_result">ように見える要素を選択しようとしているが、私は私のスクリプトを実行したときにそれが現れていません。私もレコードのためにsoup.find_all("li", {"class" : "result first_result"})を試しましたが、まだ何もありません。

私は間違っていますか?

編集:alecxeさんのリクエスト私はそれまでのコードを投稿しました。私はPython 3.4を使用している64ビット版のWindows 7を使用していますが、これが原因です。私はこの質問をした特定の部分が###METACRITIC STUFF###

from bs4 import BeautifulSoup 
from urllib3 import poolmanager 
import csv 
import requests 
import sys 
import os 
import codecs 
import re 
import html5lib 
import math 
import time 
from random import randint 

connectBuilder = poolmanager.PoolManager() 

inputstring = sys.argv[1] #argv string MUST use double quotes 

inputarray = re.split('\s+',inputstring) 

##########################KAT STUFF######################## 


katstring = "" 

for item in inputarray: katstring += (item + "+") 
katstring=katstring[:-1] 
#kataddress = "https://kat.cr/usearch/?q=" + katstring #ALL kat 
kataddress = "https://kat.cr/usearch/" + inputstring + " category:tv/?field=seeders&sorder=desc" #JUST TV kat 
#print(kataddress) 
numSeedsArray = [] 
numLeechArray = [] 


r = requests.get(kataddress) 
soup = BeautifulSoup(r.content, "html5lib") 
totalpages = [h2.find('span') for h2 in soup.findAll('h2')][0].text #get a string that looks like 'house of cards results 1-25 from 178' 
totalpages = int(totalpages[-4:]) #slice off everything but the total # of pages 
totalpages = math.floor(totalpages/25) 

#print("totalpages= "+str(totalpages)) 
iteration=0 
savedpage = "" 

def getdata(url): 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content, "html5lib") 
    global numSeedsArray 
    global numLeechArray 


    tds = soup.findAll("td", { "class" : "green center" }) 
    numSeedsArray += [int(td.text) for td in tds] 
    tds = soup.findAll("td", { "class" : "red lasttd center"}) 
    numLeechArray += [int(td.text) for td in tds] 
    #print(numSeedsArray) 



def getnextpage(url): 
    global iteration 
    global savedpage 
    #print("url examined= "+url) 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content, "html5lib") 
    nextpagelinks = soup.findAll("a", { "class" : "turnoverButton siteButton bigButton" }) 
    nextpagelinks = [link.get('href') for link in nextpagelinks] 
    #print(nextpagelinks) 

    activepage = soup.findAll("a", { "class" : "turnoverButton siteButton bigButton active" }) 
    #print("activepage= " +activepage[0].text) 
    currentpagenum = activepage[0].text 
    #print("currentpagenum= "+currentpagenum) 
    if len(currentpagenum)==1 and iteration>1: 
     nextpage = savedpage+str(int(currentpagenum)+1)+str(nextpagelinks[0][-27:]) 
     #print("nextpage= "+nextpage) 
     nextpage = re.sub(r'(%20)', ' ', nextpage) 
     nextpage = re.sub(r'(%3A)', ':', nextpage) 
     nextpage = "https://kat.cr"+nextpage 
     #print(nextpage) 
    elif len(currentpagenum)==1 and iteration<=1: 
     nextpage = str(nextpagelinks[0][:-28])+str(int(currentpagenum)+1)+str(nextpagelinks[0][-27:]) 
     savedpage = str(nextpagelinks[0][:-28]) 
     #print("savedpage= "+savedpage) 
     nextpage = re.sub(r'(%20)', ' ', nextpage) 
     nextpage = re.sub(r'(%3A)', ':', nextpage) 
     nextpage = "https://kat.cr"+nextpage 
     #print(nextpage) 
    elif len(currentpagenum)==2: 
     nextpage = savedpage+str(int(currentpagenum)+1)+str(nextpagelinks[0][-27:]) 
     #print("nextpage= "+nextpage) 
     nextpage = re.sub(r'(%20)', ' ', nextpage) 
     nextpage = re.sub(r'(%3A)', ':', nextpage) 
     nextpage = "https://kat.cr"+nextpage 
     #print(nextpage) 

    return nextpage 



if totalpages<2: 
    while iteration < totalpages-1: #should be totalpages-1 for max accuracy 
     getdata(kataddress) 
     iteration+=1 
     kataddress = getnextpage(kataddress) 
else: 
    while iteration < 2: #should be totalpages-1 for max accuracy 
     getdata(kataddress) 
     iteration+=1 
     kataddress = getnextpage(kataddress) 
    # print(str(sum(numSeedsArray))) 
    # print(str(sum(numLeechArray))) 

print(str(sum(numLeechArray)+sum(numSeedsArray))) 

def getgoogdata(title): 
    title = re.sub(r' ', '+', title) 
    url = 'https://www.google.com/search?q=' +title+ '&ie=utf-8&oe=utf-8' 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content, "html5lib") 
    resultnum = soup.find("div", {"id": "resultStats"}).text[:-14] 

    s2 = resultnum.replace(',', '') 
    resultnum = re.findall(r'\b\d+\b', s2) 
    print(resultnum) 

getgoogdata(inputstring) 



####################METACRITIC STUFF######################### 
metainputstring = "" 
for item in inputarray: 
    metainputstring += item + " " 
metainputstring = metainputstring[:-1] 
metacriticaddress = "http://www.metacritic.com/search/tv/" + metainputstring + "/results" 

print (metacriticaddress) 

r = requests.get(metacriticaddress) 
soup = BeautifulSoup(r.content, "html5lib") 
first_result = soup.find_all("li", attrs={"class" : "first_result"}) 

# first_result = soup.select("li.result.first_result") 
print(first_result) 
+1

でしたこれまでの完全なコードを投稿しますか? – alecxe

+0

問題ありません。 –

答えて

2

その他の回答はすべて実際の問題とは関係ありません。あなたがに必要

は、検索結果を見ることができるように実際のブラウザのふり:(もちろんゲーム・オブ・スローンズを探し、)

r = requests.get(metacriticaddress, headers={ 
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36" 
}) 

証明:

>>> from bs4 import BeautifulSoup 
>>> 
>>> import requests 
>>> 
>>> metacriticaddress = "http://www.metacritic.com/search/tv/game%20of%20thrones/results" 
>>> r = requests.get(metacriticaddress, headers={ 
...  "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36" 
... }) 
>>> soup = BeautifulSoup(r.content, "html5lib") 
>>> first_result = soup.find_all("li", class_="first_result") 
>>> 
>>> print(first_result[0].find("h3", class_="product_title").get_text(strip=True)) 
Game of Thrones 
+0

それはまさにそれでした。 –

2

Quoting the documentation:

下一番下にあるそれは、特定のCSSクラスを持つタグを検索することは非常に便利だが、CSSの名前属性 "class"は、Pythonの予約語です。キーワード引数としてclassを使用すると、構文エラーが発生します。美しいスープ4.1.2の時点で、あなたはこのようにキーワード引数class_

を使用してCSSクラスで検索することができ、あなたの代わりに記述する必要があります。soup.find_all("li", class_="first_result")

4.1.2より前のバージョンのBeautifulSoupを使用している場合、または辞書を渡すことを強く求めている場合は、辞書にattrsパラメータ(soup.find_all("li", attrs={"class" : "first_result"}))が入力されるように指定する必要があります。

+0

まだ動作していません。他の全く関係のない問題がいくつかあると思います...ここに投稿するにはあまりにも多くのコードがあります。とにかくありがとう! –

1

最初の試行(soup.find_all("li", {"class" : "first_result"}))はほぼ正しいですが、辞書が渡されるパラメータ(この場合はパラメータ名はattrs)を指定し、それをsoup.find_all("li", attrs={"class" : "first_result"})のように指定する必要があります。

しかし、私はCSSセレクターでこれを行うことをお勧めします。これは、複数のクラスと照合するためです。あなたは.select()は常にリストを返すことに注意してください。この

results = soup.select("li.result.first_result") 

のようなスープの.select()方法を使用してこれを行うことができますので、一つだけの要素があるかどう、results[0]としてそれにアクセスすることを忘れないでください。

+0

私もselect()メソッドを試しました。空の配列を返します。わかりません。 –

+1

あなたがスクラップしようとしているURLは何ですか? – wpercy

+0

'http://www.metacritic。com/search/tv/adventure time/results' –

関連する問題