Skip to main content
 首页 » 编程设计

python之为什么 Beautiful Soup 找不到具有多个类的这个元素

2025年05月04日24mq0036

我正在尝试选择一个看起来像 <li class="result first_result"> 的元素使用查询 soup.find_all("li", {"class" : "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) 

请您参考如下方法:

所有其他答案与您的实际问题无关。

您需要假装成真正的浏览器才能看到搜索结果:

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