cURL请求未识别zip4字段值及DOM解析报错问题排查
解决cURL获取美国国会选区信息的两个问题
一、请求结果与网页不一致的问题
服务器未正确处理zip4参数,导致返回该邮编下全部议员信息,核心原因是cURL请求缺少浏览器提交时的关键请求头,无法模拟正常用户行为。
解决步骤
在cURL配置中添加必要请求头,确保服务器正确解析参数:
$curl = curl_init(); $fields = array( 'zip' => $userzip, 'zip4' => $userzip4, 'thru_zip4' => $user_thru, ); $fields_string = http_build_query($fields); // 模拟浏览器请求头 $headers = array( 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Referer: https://ziplook.house.gov/zip/ziplook.html', 'Content-Type: application/x-www-form-urlencoded' ); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 新增请求头设置 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // 跟随可能的重定向 $data = curl_exec($curl); curl_close($curl);
二、"Trying to get property 'nodeValue' of non-object"报错问题
遍历表格行时,表头行、空行等没有足够的<td>元素,$cols->item(0)返回null,直接访问nodeValue触发错误。
解决步骤
在访问nodeValue前先验证元素是否存在,同时优化变量重置逻辑:
foreach ($rows as $row) { $cols = $row->getElementsByTagName('td'); $links = $row->getElementsByTagName('a'); $link = ''; // 每次循环重置链接,避免残留上一行的值 foreach ($links as $linkNode){ $link = $linkNode->getAttribute('href'); } // 先判断元素有效性,再处理内容 if ($cols->length > 0 && $cols->item(0) !== null && trim($cols->item(0)->nodeValue) !== '') { // 用htmlspecialchars转义输出,避免HTML注入 echo 'ZIP CODE: '.htmlspecialchars($cols->item(0)->nodeValue).'<br />'; echo 'MEMBER: '.htmlspecialchars($cols->item(1)->nodeValue).'<br />'; echo 'MEMBER-LINK: '.htmlspecialchars($link).'<br />'; echo 'STATE/DISTRICT: '.htmlspecialchars($cols->item(2)->nodeValue).'<br />'; echo 'ROOM: '.htmlspecialchars($cols->item(3)->nodeValue).'<br />'; echo 'PHONE: '.htmlspecialchars($cols->item(4)->nodeValue).'<br />'; echo '<hr />'; } }
额外优化建议
- 开启cURL调试模式排查请求问题:
curl_setopt($curl, CURLOPT_VERBOSE, TRUE); - 对DOM加载可能的警告进行抑制:
libxml_use_internal_errors(true);,加载后再恢复:libxml_clear_errors();
内容的提问来源于stack exchange,提问作者user18374810
相关产品推荐
相关产品推荐

