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

如何使用Scrapy抓取无标签文本数据?

维基百科1月1日页面爬取问题解决方案

获取无标签包裹的文本及完整条目内容

你遇到的问题核心是目标文本属于li元素下的独立文本节点,而非a标签的子内容,要获取完整的事件条目,只需针对li元素提取其下所有文本内容即可,Scrapy原生支持两种简便方法:

方法1:使用XPath的string(.)(推荐)

XPath的string(.)方法会将当前元素下的所有文本节点(包括子标签内的和独立文本节点)拼接成一个完整字符串,代码示例:

# 定位所有事件对应的li元素
event_li_list = response.css('div.mw-parser-output ul li')
events = []

for li in event_li_list:
    # 提取当前li下的全部文本
    full_content = li.xpath('string(.)').get()
    # 清理多余空格和首尾空白
    cleaned_content = ' '.join(full_content.split())
    events.append(cleaned_content)

# 输出第一个完整事件条目
print(events[0])

执行后会得到包含Begin their year in office on January 1的完整文本,比如:153 BC Roman consuls Begin their year in office on January 1 [1]

方法2:使用CSS选择器提取所有文本节点

通过CSS选择器分别获取li自身的文本节点和所有子元素的文本节点,再拼接清理:

event_li_list = response.css('div.mw-parser-output ul li')
events = []

for li in event_li_list:
    # 获取li自身的文本节点 + 所有子元素的文本节点
    text_fragments = li.css('::text').getall() + li.css('*::text').getall()
    # 过滤空内容并拼接
    full_content = ' '.join([frag.strip() for frag in text_fragments if frag.strip()])
    events.append(full_content)

关键说明

  • 无需单独抓取a标签文本再拼接,直接针对li元素提取全部文本即可覆盖所有内容(包括无标签的独立文本节点)。
  • 两种方法均为Scrapy原生支持,无需额外依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:25:17