如何使用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
相关产品推荐
相关产品推荐

