使用dom从HTML获取多个值(无ID或类)

时间:2018-08-18 05:39:10

标签: php html parsing simple-html-dom

我正在尝试从此http://jsbin.com/noxuqusoga/edit?html输出html页面获取代理和端口值。

这里是该页面中表结构的示例,仅包含一个tr,但实际的HTML具有许多具有相似结构的tr元素:

<table class="table" id="tbl_proxy_list" width="950">
    <tbody>
        <tr data-proxy-id="1355950">
            <td align="left"><abbr title="103.227.175.125">103.227.175.125 </abbr></td>
            <td align="left"><a href="/proxy-server-list/port-8080/" title="Port 8080 proxies">8080</a></td>
            <td align="left"><time class="icon icon-check timeago" datetime="2018-08-18 04:56:47Z">9 min ago</time></td>
            <td align="left">
            <div class="progress-bar" data-value="22" title="1089">
            <div class="progress-bar-inner" style="width:22%; background-color: hsl(26.4,100%,50%);">&nbsp;</div>
            </div>
            <small>1089 ms</small></td>
            <td style="text-align:center !important;"><span style="color:#009900;">95%</span> <span> (94)</span></td>
            <td align="left"><img alt="sg" class="flag flag-sg" src="/assets/images/blank.gif" style="vertical-align: middle;" /> <a href="/proxy-server-list/country-sg/" title="Proxies from Singapore">Singapore <span class="proxy-city"> - Bukit Timah </span> </a></td>
            <td align="left"><span class="proxy_transparent" style="font-weight:bold; font-size:10px;">Transparent</span></td>
            <td><span>-</span></td>
        </tr>
  </tbody>
</table>

我能够取消代理地址,但是由于<td>没有ID或类,并且值包含一些超链接,而另一些则没有,我在端口上遇到了困难。

如何为整个废弃结果生成-> ip:port之类的结果。

这是我的代码

$html = file_get_html('http://jsbin.com/noxuqusoga/');

// Find all images
foreach($html->find('abbr') as $element)
       echo $element->title . '<br>';

foreach($html->find('td a') as $element)
       echo $element->plaintext . '<br>';

请帮助,
谢谢

1 个答案:

答案 0 :(得分:1)

与其为graph = new UndirectedGraph<State, DefaultEdge>(DefaultEdge.class); 元素(或其中的元素,如tdabbr)编写选择器,不如为其a父元素编写选择器,然后遍历这些元素tr s(行),并为每一行获取所需的该行的子级:

tr

作为一种选择,您应该知道选择元素时,除了使用css选择器之外,还可以选择通过元素的索引来获取元素。在您的情况下,每个// Select all tr elements inside tbody foreach ($html->find('tbody tr') as $row) // the second parameter (zero) indicates we only need the first element matching our selector // ip is in the first <abbr> element that is child of a td $ip = $row->find('td abbr', 0)->plaintext; // port is in the first <a> element that is child of a td $port = $row->find('td a', 0)->plaintext; print "$ip:$port\n"; } 所需要的是每个tr元素内的第一个和第二个td元素。因此,您还可以找到每个tr的第一个和第二个孩子来提取数据。