从指定HTML页面提取文本失败,XPath返回空数组求解决
问题分析与解决
核心错误点
- 你直接把
response.content转成字符串传入StringIO,这会把字节流的repr形式(比如b'xxx')当成HTML内容解析,导致etree无法识别正常的<body>、<pre>结构,xpath自然找不到内容。 - 其实pastebin的raw页面本身就是纯文本输出,完全没必要用xpath解析HTML,属于多此一举。
正确的实现方式
方式1:直接获取纯文本(最简便)
raw页面返回的就是纯文本,直接取response.text即可:
import requests response = requests.get("https://pastebin.com/raw/HtqbjSdE") # requests会自动识别编码,也可手动指定确保正确性 response.encoding = 'utf-8' paste_content = response.text print(paste_content)
方式2:如果非要用xpath解析(仅作演示)
如果坚持用lxml解析,需要传入正确的文本内容,而不是字节的字符串形式:
import requests from lxml import etree from io import StringIO response = requests.get("https://pastebin.com/raw/HtqbjSdE") # 用response.text作为HTML内容,而非str(response.content) tree = etree.parse(StringIO(response.text), etree.HTMLParser()) content_path = "//body/pre/text()" paste_content = tree.xpath(content_path) # xpath返回列表,需拼接成完整字符串 print(''.join(paste_content))
为什么之前的xpath返回空数组?
当你执行str(response.content)时,得到的是类似b'<!DOCTYPE html>\n<html>...'的字符串,etree解析这个内容时,会把b'当成文本内容的一部分,整个结构完全不是正常的HTML,所以//body//pre/text()根本匹配不到任何元素,自然返回空数组。
内容的提问来源于stack exchange,提问作者Martin Chapman
相关产品推荐
相关产品推荐

