使用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
相关产品推荐
相关产品推荐

