使用BeautifulSoup无法选中HTML元素的网页抓取问题求助
问题:抓取诺克斯郡田纳西州房产网站的姓名与地址信息
问题背景
我是一名网页爬虫新手,想要抓取诺克斯郡田纳西州房产网站(https://propertyinfo.knoxcountytn.gov/Datalets/Datalet.aspx?sIndex=1&idx=1)中的姓名与地址信息。尝试了多种方法都没成功,希望能获取目标区域的HTML以提取文本并写入CSV文件。若链接失效,可通过诺克斯郡官网进入房产搜索选择任意房产。
尝试的代码
方法1:BeautifulSoup find() 方法
from splinter import Browser import pandas as pd from bs4 import BeautifulSoup as soup import requests from webdriver_manager.chrome import ChromeDriverManager owner_soup = soup(html, 'html.parser') owner_elem = owner_soup.find('td', class_='DataletData') owner_elem
方法2:BeautifulSoup find_all() 方法
# 目标信息所在区块的标签和类名 owner_soup = soup(html, 'html.parser') owner_elem = owner_soup.find_all('div', class_='datalet_div_2') owner_elem
方法3:Splinter CSS定位
browser.find_by_css('td.DataletData')[15]
遇到的问题
- 使用
find()返回None,替换为find_all()则返回空数组 - Splinter定位元素后返回对象:
<splinter.driver.webdriver.WebDriverElement at 0x11a763160>
无法直接提取HTML或文本内容。
解决方案
1. 确保获取动态渲染后的完整HTML
该网站采用动态渲染,直接用requests拉取的源码不包含目标内容,需用Splinter等待页面加载完成后再获取HTML:
from splinter import Browser from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup as soup # 初始化Chrome浏览器 browser = Browser('chrome', executable_path=ChromeDriverManager().install(), headless=False) browser.visit('https://propertyinfo.knoxcountytn.gov/Datalets/Datalet.aspx?sIndex=1&idx=1') # 等待目标元素加载(最长等待10秒) browser.is_element_present_by_css('td.DataletData', wait_time=10) # 获取页面完整渲染后的HTML html = browser.html owner_soup = soup(html, 'html.parser')
2. 正确提取目标元素内容
页面中姓名和地址存于td.DataletData元素中,可通过索引定位后提取文本:
# 获取所有目标数据元素 data_elements = owner_soup.find_all('td', class_='DataletData') if data_elements: # 根据页面实际结构调整索引,示例用15、16对应姓名和地址 owner_name = data_elements[15].get_text(strip=True) owner_address = data_elements[16].get_text(strip=True) print(f"姓名: {owner_name}\n地址: {owner_address}")
3. Splinter元素提取内容的正确方法
如果使用Splinter定位元素,可通过以下方法提取文本或HTML:
# 提取元素文本 target_element = browser.find_by_css('td.DataletData')[15] print(target_element.text) # 提取元素HTML内容 print(target_element.html)
4. 将数据写入CSV文件
用pandas快速将抓取到的数据写入CSV:
import pandas as pd # 构造数据字典 property_data = {'姓名': [owner_name], '地址': [owner_address]} df = pd.DataFrame(property_data) # 写入CSV文件 df.to_csv('knox_county_owner_info.csv', index=False, encoding='utf-8')
注意事项
- 动态页面必须等待元素加载完成后再操作,避免获取空内容
- 定期检查页面结构,网站可能更新HTML类名或布局
- 遵守网站爬虫规则,控制请求频率,避免IP被封禁
内容的提问来源于stack exchange,提问作者Adam Bachrach
相关产品推荐
相关产品推荐

