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

