python爬虫如何通过xpath获取br后的文本内容
前言
昨天在完成作业时,用selenium库抓取古诗文网时,抓取不到br标签后的文本,CS了很久很久,最后总结了前辈们的思路,解决了我的问题,希望给大家带来一点解决思路
一、为什么xpath爬取不到br标签后的内容?
这是因为br标签可以表示数据的开始,也可以表示数据的结束。
二、解决步骤
1.完整代码
代码如下:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from lxml import etree # 爬取古诗文网的标题和古诗 def spider_gsww(): service = Service('./chromedriver-win64/chromedriver.exe') driver = webdriver.Chrome(service=service) driver.get('https://www.gushiwen.cn/') e = etree.HTML(driver.page_source) title = e.xpath("//div[@class='left']/h1/a/text()") print("---------网站信息标题----------\n") print(f'\t\t{title[0]}\n') names = e.xpath("//b/text()") ups = e.xpath("//p[@class='source']/a/img/@alt") songs = e.xpath("//div[@class='contson']") #1 texts = e.xpath("//div[@class='contson']/p") count = 1 for n, up, s, t in zip(names, ups, songs, texts): print(f'标题:{n}, 诗人:{up} \n') if count % 2: print("".join(s.xpath('text()'))) #2 else: print("".join(t.xpath('text()'))) count += 1 driver.quit() if __name__ == '__main__': spider_gsww()
2.解决代码
代码如下:
songs = e.xpath("//div[@class='contson']/text()") #错误示范,下面为正确的示范
songs = e.xpath("//div[@class='contson']") #先获取到目标的上一级位置 for s in songs: #通过for循环遍历变量中存储的每个选定元素 print("".join(s.xpath('text()'))) # "".join(...):将 XPath 表达式选择的文本内容联接到单个字符串中。该方法将可迭代对象的所有元素联接到单个字符串中。空字符串用作分隔符,这意味着文本内容之间将没有任何空格或其他字符(替换br标签)。 成功展示:
总结
br
标签的作用是在文本中换行,它与python中换行符\n
作用比较相似,每一次的出现都代表一次换行。同时,它也是一个空元素(只有一个开始标签,没有结束标签,没有元素内容)。
所以我们可以先遍历目标变量,然后用""空字符串为分隔符,去替换br标签,最后用join方法去连接字符串。