首页 > 解决方案 > 使用 Beautifulsoup 在 Python 中提取数据

问题描述

我正在尝试从https://ash.confex.com/ash/2019/webprogram/start.htmfind_all中提取数据并收到beautifulsoup错误

import webbrowser
import os
import requests
from bs4 import BeautifulSoup
import sys
import wget
import pandas as pd
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome('D:\\crome drive\\chromedriver.exe')
driver.get('https://ash.confex.com/ash/2019/webprogram/start.html')
searchterm = driver.find_element_by_id("words").send_keys("CAR-T")
driver.find_element_by_name("submit").click()
#driver.find_element_by_tag_name("resulttitle")
#driver.find_element_by_class_name("a")

soup_level1=BeautifulSoup(driver.page_source, 'lxml')
#fl=soup_level1.find_all(class_='soup_level1')
results = soup_level1.find_all('div', attrs={'class':'resulttitle'})
tag = results.findall('a', attrs='href')

我收到错误

AttributeError:ResultSet 对象没有属性“findall”。您可能将项目列表视为单个项目。当您打算调用 find() 时,您是否调用了 find_all()?

标签: python-3.xweb-scrapingbeautifulsoup

解决方案


是的,正如错误所说的那样 - 该find_all方法应该在 html 树上使用,但在您的代码中,变量results是 ResultSet 对象。在 bs4 中,这是一个列表,其中每个项目都是一个 HTML 树。

results = soup_level1.find_all('div', attrs={'class':'resulttitle'})
print(type(results))   # <class 'bs4.element.ResultSet'>
print(results)   # []

这也表明你results是空的。我搜索了 HTML 并没有看到任何带有 class = "resulttitle" 的 div,因此您可能需要仔细检查您要查找的内容。

理论上,如果您的results变量不为空,您可以遍历其中的每个项目,results 然后找到您要查找的所有链接:

results = soup_level1.find_all('div', attrs={'class':'resulttitle'})
for result in results:
    tag_list = result.find_all('a', attrs='href)     
    # this will yield another list where each item is an HTML tree

推荐阅读