Scrapy如何提取id包含class_id的所有元素的文本内容
Scrapy提取指定id锚点元素下文本节点的实现方法
你当前的XPath写法存在语法问题,无法正确提取目标文本,可根据需求选择对应实现方式:
- 提取所有匹配a标签下的全部文本(包含a标签内部嵌套子元素的文本,日常爬虫最常用场景)
不要用错误的*::text语法,正确的XPath路径是匹配到a节点后,用//text()取所有后代文本节点,配合Scrapy的getall()方法提取结果。如果需要逐个a标签对应提取文本、避免不同节点的文本混淆,就先遍历匹配到的a节点,从当前节点出发做相对路径查找:def parse(self, response): page = response.url.split("/")[-2] # 逐节点提取,避免不同a标签的文本混排 for a_tag in response.xpath('//a[contains(@id, "class_id")]'): # 相对路径查找,前面加.表示从当前a节点开始匹配 all_text = a_tag.xpath('.//text()').getall() # 拼接文本、去除首尾多余的空白、换行符 cleaned_text = ''.join(all_text).strip() print(cleaned_text) filename = f'class-{page}.html' with open(filename, 'wb') as f: f.write(response.body) self.log(f'Saved file {filename}') - 仅提取a标签的直接文本子节点(不包含a标签内部嵌套的span、div等子元素里的文本)
把XPath路径改成./text()即可,仅匹配当前节点的直接子文本节点:for a_tag in response.xpath('//a[contains(@id, "class_id")]'): direct_text = a_tag.xpath('./text()').getall() cleaned_direct_text = ''.join(direct_text).strip() print(cleaned_direct_text)
注意点:遍历单个节点做XPath匹配时,路径前必须加
.,否则会默认从整个HTML文档的根节点开始查找文本,导致提取结果错乱。
内容的提问来源于stack exchange,提问作者John Jacob
相关产品推荐
相关产品推荐

