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

如何处理Python中AutoScraper合并wanted_list项时的数据不匹配?

解决问答爬取中的长度不匹配与映射问题

方案一:优化AutoScraper的使用逻辑

问题核心是分开抓取问题和答案,导致两者的抓取结果数量、顺序无法对齐。AutoScraper更适合抓取结构化的成对内容,可通过以下步骤修正:

  1. 抓取完整的问答块:页面中每个FAQ项是独立结构单元,先让AutoScraper学习整个问答块的模式,而非单独的问题或答案。
  2. 拆分问答对:从抓取到的每个块中分离问题和答案,确保一一对应。
  3. 处理缺失值:拆分后若出现问题或答案缺失,用空值填充,保证数据长度一致。

修改后的代码示例:

from autoscraper import AutoScraper
import pandas as pd

url = "https://www.holidify.com/places/manali"
# 选择一个完整的问答对作为学习样本
wanted_sample = [
    "What is famous about Manali?",
    "Very beautiful. Snows through most of January and February. Can be visited throughout the year. Snow sports, paragliding and other adventure sports available. Starting point for drives to Spiti valley and Ladakh."
]

scraper = AutoScraper()
# 构建针对问答块的抓取规则
scraper.build(url, wanted_sample)
# 获取所有匹配的问答内容块
faq_blocks = scraper.get_result_similar(url, unique=False, keep_order=True)

# 拆分问题和答案,确保一一对应
questions = []
answers = []
# 按两两一组拆分(可根据实际抓取结果调整逻辑)
for i in range(0, len(faq_blocks), 2):
    q = faq_blocks[i] if i < len(faq_blocks) else ""
    a = faq_blocks[i+1] if (i+1) < len(faq_blocks) else ""
    questions.append(q)
    answers.append(a)

# 合并为DataFrame
faq_df = pd.DataFrame({"question": questions, "answer": answers})
print(faq_df)

若AutoScraper抓取的块结构不是两两分组,可先观察faq_blocks的输出格式,调整拆分逻辑(比如用字符串分割、正则提取等方式分离问题和答案)。

方案二:改用BeautifulSoup(更可控的方案)

如果AutoScraper的自动匹配不够稳定,推荐用BeautifulSoup直接解析页面结构,精准定位FAQ元素,天然保证问答一一对应:

  1. 定位FAQ区域:通过浏览器开发者工具查看页面FAQ的HTML结构(Holidify的FAQ通常在类名含faq或accordion的容器中)。
  2. 遍历每个问答项:逐个提取项中的问题和答案,主动填充空值处理缺失内容。

代码示例:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.holidify.com/places/manali"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}

# 请求页面
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

# 定位FAQ容器(根据实际页面结构调整选择器)
faq_container = soup.find("div", class_="faqSection")
faq_items = faq_container.find_all("div", class_="faqItem")

questions = []
answers = []

for item in faq_items:
    # 提取问题,缺失则填充空字符串
    question = item.find("h3").get_text(strip=True) if item.find("h3") else ""
    # 提取答案,缺失则填充空字符串
    answer = item.find("div", class_="faqAnswer").get_text(strip=True) if item.find("div", class_="faqAnswer") else ""
    questions.append(question)
    answers.append(answer)

# 合并为DataFrame
faq_df = pd.DataFrame({"question": questions, "answer": answers})
print(faq_df)

关键注意事项

  • 页面结构变化:网站可能更新HTML结构,需定期检查选择器有效性。
  • 反爬机制:添加User-Agent头模拟浏览器请求,避免被封禁。
  • 缺失值处理:通过条件判断主动填充空值,确保问题和答案列表长度完全一致,避免合并DataFrame时出错。

内容的提问来源于stack exchange,提问作者Priya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:01:04