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

PHP抓取MEPCO重复账单查询网站数据失败,求解决方案

PHP抓取MEPCO账单数据的修正方案

一、修正正则表达式方案

你的正则无法正确提取数据,大概率是因为HTML中存在多余空格、换行,或者正则使用贪婪匹配导致捕获内容错误。调整后的正则会兼容空白字符,并使用非贪婪模式精准捕获目标内容:

$html = '<html>
  <body>
    <div id="bill-details">
      <h2>Electricity Bill Details</h2>
      <p>Payable Amount: $200</p>
      <p>Due Date: 2023-05-01</p>
      <p>Description: This is your electricity bill for the month of April 2023.</p>
    </div>
  </body>
</html>';

// 修正后的正则,匹配任意空白+非贪婪捕获
preg_match('/<h2>\s*(.*?)\s*<\/h2>/', $html, $billHeading);
preg_match('/<p>\s*Payable Amount:\s*(.*?)\s*<\/p>/', $html, $payableAmount);
preg_match('/<p>\s*Due Date:\s*(.*?)\s*<\/p>/', $html, $dueDate);

// 输出时增加存在性判断,避免索引报错
echo "Bill Heading: " . ($billHeading[1] ?? 'N/A') . "\n";
echo "Payable Amount: " . ($payableAmount[1] ?? 'N/A') . "\n";
echo "Due Date: " . ($dueDate[1] ?? 'N/A') . "\n";

二、推荐使用DOM解析方案

正则处理HTML天生脆弱,一旦目标网站的HTML结构有细微变化(比如标签新增属性、换行调整),正则就会失效。更可靠的方案是使用PHP原生的DOMDocument和DOMXPath解析HTML:

$html = '<html>
  <body>
    <div id="bill-details">
      <h2>Electricity Bill Details</h2>
      <p>Payable Amount: $200</p>
      <p>Due Date: 2023-05-01</p>
      <p>Description: This is your electricity bill for the month of April 2023.</p>
    </div>
  </body>
</html>';

// 初始化DOM文档,忽略不规范HTML的解析错误
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();

// 初始化XPath查询工具
$xpath = new DOMXPath($dom);

// 提取账单标题
$billHeadingNode = $xpath->query('//div[@id="bill-details"]/h2')->item(0);
$billHeading = $billHeadingNode ? trim($billHeadingNode->nodeValue) : 'N/A';

// 提取应付金额
$payableAmountNode = $xpath->query('//div[@id="bill-details"]/p[contains(text(), "Payable Amount:")]')->item(0);
$payableAmount = $payableAmountNode ? trim(str_replace('Payable Amount:', '', $payableAmountNode->nodeValue)) : 'N/A';

// 提取到期日期
$dueDateNode = $xpath->query('//div[@id="bill-details"]/p[contains(text(), "Due Date:")]')->item(0);
$dueDate = $dueDateNode ? trim(str_replace('Due Date:', '', $dueDateNode->nodeValue)) : 'N/A';

// 输出结果
echo "Bill Heading: " . $billHeading . "\n";
echo "Payable Amount: " . $payableAmount . "\n";
echo "Due Date: " . $dueDate . "\n";

补充说明

实际抓取时,需先通过file_get_contents或cURL获取目标页面的HTML内容,同时要严格遵守目标网站的使用条款,避免频繁请求导致IP被封禁。

内容的提问来源于stack exchange,提问作者Ahtisham Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:52:34