如何在Scrapy中抓取<td>内<strong>标签后的文本内容?
嘿,我来帮你解决这个抓取问题!你遇到的情况是因为XPath的text()只会抓取当前节点下直接的子文本节点,而你要的版本号是<strong>标签的兄弟文本节点,所以原来的写法拿不到它。下面给你两种靠谱的解决方案:
解决方案1:精准定位兄弟文本节点
直接用XPath的following-sibling轴,定位到<strong>标签后面的文本节点,这样能直接拿到目标内容:
rows = response.xpath('//table[contains(@class, "sortable")]/tbody//tr') for row in rows: columns = row.xpath('td') # 定位到strong后的兄弟文本,再去除前后空白 version = columns[0].xpath('strong/following-sibling::text()').extract_first().strip()
这个方法的好处是精准,只要页面结构不变,就能直接拿到版本号,不需要额外的字符串处理。
解决方案2:获取整个单元格文本后处理
如果担心页面结构可能有小变动(比如<strong>标签的位置调整),可以先拿到<td>下的所有文本内容,再通过字符串分割提取:
rows = response.xpath('//table[contains(@class, "sortable")]/tbody//tr') for row in rows: columns = row.xpath('td') # 获取整个td的所有文本内容 full_text = columns[0].xpath('string(.)').extract_first() # 按冒号分割,取后半部分并去除空白 version = full_text.split(':')[-1].strip()
这个方法更鲁棒,哪怕标签结构略有变化,只要文本里的冒号分隔逻辑不变,就能拿到版本号。
顺带解释下你原来代码的问题:columns[0].xpath('text()')只会抓取<td>节点下的第一个子文本节点(也就是"Hadoop Software "),而<strong>标签和后面的版本号文本是<td>的其他子节点,所以自然拿不到目标内容啦。
内容的提问来源于stack exchange,提问作者thedevd
相关产品推荐
相关产品推荐

