You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python提取HTML元素area标签的onclick属性时遇到问题

解决提取HTML area标签onclick属性的问题

问题概述

你正在尝试从网页的<area>标签中提取onclick属性,但当前的Python代码未能成功获取。你提供的目标<area>标签代码如下:

<area class="borderimage" coords="21.32,14.4,933.96,180.56" href="javascript:void(0);" onclick="return show_pop('78545','51022929357','1')" onmouseover="borderit(this,'black','<b>इंदौर, गुरुवार, 10 मई , 2018 <b><br><bआप पढ़ रहे हैं देश का सबसे व...')" onmouseout="borderit(this,'white')" alt="<b>इंदौर, गुरुवार, 10 मई , 2018 <b><br><bआप पढ़ रहे हैं देश का सबसे व..." shape="rect">

代码问题分析

看了你的代码,主要问题出在循环处理<area>元素的部分:

  • 你通过XPATH_REVIEW_SECTION_2已经获取到了<area>元素列表,循环中的review就是单个<area>元素,但你却用'.//area[@data-hook="onclick"]'这个XPath去查找,这完全没必要,而且表达式本身错误(onclick是属性名,不是data-hook的属性值)。

解决方案

下面提供两种可行的方法来提取onclick属性:

方法1:使用lxml直接获取属性

利用lxml元素对象的get()方法直接获取属性值,这是最简洁的方式:

import requests
from lxml import html
import re

paper_url = 'http://epaper.bhaskar.com/indore/129/10052018/mpcg/1/' 
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36'} 

page = requests.get(paper_url, headers=headers)
page_response = page.text
parser = html.fromstring(page_response)

# 获取总页数部分(保留你的原有逻辑)
XPATH_Total_Pages = '//div[contains(@class,"fs12 fta w100 co_wh pdt5")]//text()'
raw_total_pages = parser.xpath(XPATH_Total_Pages)
lastpage = raw_total_pages[-1]
finallastpage = int(lastpage)
print(f"Total pages: {finallastpage}")

# 获取所有class为borderimage的area标签
XPATH_REVIEW_SECTION_2 = '//area[@class="borderimage"]'
reviews = parser.xpath(XPATH_REVIEW_SECTION_2)

# 提取onclick属性
for review in reviews:
    onclick_attr = review.get('onclick')
    if onclick_attr:
        print(f"Onclick value: {onclick_attr}")
        # 可选:提取show_pop函数的参数
        param_match = re.search(r'show_pop\(\'(\d+)\',\'(\d+)\',\'(\d+)\'\)', onclick_attr)
        if param_match:
            id1, id2, id3 = param_match.groups()
            print(f"Extracted parameters: ID1={id1}, ID2={id2}, ID3={id3}")

方法2:使用BeautifulSoup(更直观的HTML解析)

如果你更习惯用BeautifulSoup,也可以这样实现:

import requests
from bs4 import BeautifulSoup
import re

paper_url = 'http://epaper.bhaskar.com/indore/129/10052018/mpcg/1/' 
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36'} 

page = requests.get(paper_url, headers=headers)
soup = BeautifulSoup(page.text, 'html.parser')

# 获取总页数(模拟你的原有逻辑)
total_pages_div = soup.find('div', class_='fs12 fta w100 co_wh pdt5')
if total_pages_div:
    raw_total_pages = total_pages_div.get_text(strip=True).split()
    lastpage = raw_total_pages[-1]
    finallastpage = int(lastpage)
    print(f"Total pages: {finallastpage}")

# 获取所有class为borderimage的area标签
area_tags = soup.find_all('area', class_='borderimage')

# 提取onclick属性
for area in area_tags:
    onclick_attr = area.get('onclick')
    if onclick_attr:
        print(f"Onclick value: {onclick_attr}")
        # 可选:提取show_pop函数的参数
        param_match = re.search(r'show_pop\(\'(\d+)\',\'(\d+)\',\'(\d+)\'\)', onclick_attr)
        if param_match:
            print(f"Extracted parameters: {param_match.groups()}")

关键说明

  • 不管用lxml还是BeautifulSoup,核心都是直接访问元素的属性,而不是再次用XPath或选择器去查找子元素。
  • 如果需要进一步解析onclick里的函数参数,正则表达式是简单有效的方式,上面的示例已经包含了这部分逻辑。

内容的提问来源于stack exchange,提问作者Shubham Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:15:30