html 文本解码 xpath 获取html标签

本文分享了使用Python中的etree模块与html模块解析HTML文本并进行解码的方法。通过XPath定位特定元素,并利用etree.tostring及html.unescape转换为可读字符串,实现了对网页数据的有效抓取。
import html
import etree
selector = etree.HTML(res)
url_h2 = selector.xpath("//a[@_stat='video:poster_v']/../h2")[0]
url_div = selector.xpath("//a[@_stat='video:poster_v']/../div")[0]
url_h2 = etree.tostring(url_h2).decode()
url_div = etree.tostring(url_div).decode()
print("******", url, url_img, html.unescape(url_h2), html.unescape(url_div))
posted on 2019-02-11 22:59  吃瓜的瓜农 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/guanong/p/10363545.html

<think>我们讨论的是使用requests和XPath定位id标签下的所有文字 根据引用[1]和引用[2]中的示例,我们可以总结出提取id标签下所有文字的方法: 1. 使用XPath表达式定位到具有特定id的元素 2. 使用`//text()`递归获取该元素及其所有子元素的文本节点 具体步骤: - 构建XPath表达式:`//tag[@id='id_value']//text()` 其中tag是HTML标签名(如div、p等),id_value是要定位的id属性值。 注意: - id属性在HTML中是唯一的,所以通常可以直接定位到一个元素。 - 如果不知道具体的标签名,可以用`*`代替,如:`//*[@id='id_value']//text()` 示例代码: 假设我们要提取id为"content"的div标签下的所有文字: ```python import requests from lxml import etree url = 'https://example.com' response = requests.get(url) response.encoding = 'utf-8' # 根据实际编码调整 html = etree.HTML(response.text) # 解析HTML # 使用XPath提取id为"content"的div下的所有文本 text_list = html.xpath('//div[@id="content"]//text()') # 将文本列表合并为一个字符串,并清理空白 content = ''.join(text.strip() for text in text_list if text.strip()) print(content) ``` 引用[1]中提供了类似的例子,如: `nodes_title = page.xpath('//div[@class="mtitle"]//text()')` 这里我们只需将class换成id即可。 引用[2]中提到了文本提取的方法,即使用`text()`函数。 注意事项: 1. 如果id是动态生成的(例如含有数字变化),可以使用`contains`函数进行部分匹配,但要注意id的唯一性,通常不建议部分匹配(因为id应该是唯一的)。 2. 如果网页内容是通过JavaScript动态加载的,requests可能无法获取到动态生成的内容,此时需要考虑使用Selenium等工具。 相关问题: 1. 如何提取多个id标签下的文字?(注意:每个id应该是唯一的,所以多个id意味着多次提取) 2. 当id属性值包含特殊字符(如空格、冒号)时,如何正确匹配? 3. 如何提高XPath定位的准确性和效率? </think>### 使用Requests+XPath定位ID标签下所有文字的方法 在Python中,通过`requests`获取网页内容后,使用XPath提取**特定ID标签下所有文字**的操作步骤如下: #### 核心XPath表达式 ```xpath //*[@id="your_id"]//text() ``` - `//*`:匹配任意标签类型 - `[@id="your_id"]`:定位指定ID属性 - `//text()`:递归提取所有文本节点(包括子元素) #### 完整代码实现 ```python import requests from lxml import etree # 1. 发送请求获取HTML url = "https://example.com" res = requests.get(url) res.encoding = 'utf-8' # 确保中文正常解码[^1] # 2. 解析HTML html = etree.HTML(res.text) # 3. 定位ID并提取所有文字 target_id = "content" # 替换为目标ID text_nodes = html.xpath(f'//*[@id="{target_id}"]//text()') # 4. 清理并合并文本 cleaned_text = ' '.join( text.strip() for text in text_nodes if text.strip() # 过滤空文本 ) print(cleaned_text) ``` #### 关键技巧 1. **动态ID处理** 若ID含变量部分,使用`contains()`函数: ```python # 匹配ID包含"section"的元素 html.xpath('//*[contains(@id, "section")]//text()') ``` 2. **多级文本提取** `//text()`会递归提取所有后代文本: ```html <div id="main"> 正文 <p>段落 <span>嵌套文本</span></p> </div> ``` → 输出:`正文 段落 嵌套文本` 3. **结果优化** - 使用`strip()`去除首尾空白 - 用`join()`合并为连续字符串 - 过滤`\n`等特殊字符: ```python cleaned_text = re.sub(r'\s+', ' ', cleaned_text) # 合并连续空白 ``` #### 注意事项 1. **ID唯一性** HTML中ID应唯一,若匹配到多个元素,需检查网页结构[^1] 2. **动态内容限制** 对JavaScript渲染的内容,需改用Selenium[^3] 3. **编码问题** 中文乱码时尝试编码检测: ```python res.encoding = res.apparent_encoding # 自动检测编码 ``` > 示例:提取引用[1]中的图片描述文本 > `page.xpath('//div[@style="text-align: center;"]//img/@alt')` > → 返回`['老板,出个价吧']`[^1] --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值