You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:55:19