mboost-dp1

Udtræk af tabel via PHP


Gå til bund
Gravatar #1 - Fifan
15. mar. 2012 17:51
Hej

Er det muligt at udtrække følgende to rækker fra en HTML side?
Det ville være smart hvis det kunne komme i et array eller via noget foreach.

Kunne man fx bruge PHP - HTML DOM Parser / Eller noget andet ?


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang=EN-US>
<head>
<Meta Http-equiv="Content-Type" Content="text/html; CHARSET=UTF-8">
</head>

<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="100%">
<table border="0" width="100%" cellspacing="0" cellpadding="1">
<tr>
<td></td>
<td></td>
</tr>
</table>
</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<table width=100% border="0" cellspacing="0" cellpadding="2">

<!-- Kolonne -->

<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>

<!-- Kolonne Slut-->

<!-- 1. række som skal trækkes ud -->

<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>

<!-- 1. række slut -->

<!-- 2. række som skal trækkes ud -->

<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>

<!-- 2. række slut -->

</table>

</td>
</tr>

</table>



</body>
</html>

Gravatar #2 - arne_v
15. mar. 2012 18:13
#1

Google termen er:

php html parser

Jeg finder bl.a.:

http://simplehtmldom.sourceforge.net/

Jeg vil tro at den kan navigere ned i dein TABLE.
Gravatar #3 - arne_v
15. mar. 2012 18:14
#1

Hvis du har lov til at bruge data, så kan du sikkert få dem til at lave en lidt mere programmerings venlig web service til dig.

Hvis du ikke har lov, så ................
Gravatar #4 - Fifan
15. mar. 2012 20:22
Hmm nu har jeg fået DOM værktøjet til at fjerne det første så jeg nu kun mangler at fjerne kolonnen
Gravatar #5 - Windcape
15. mar. 2012 20:27
#4

xpath, it'z hardz!
Gravatar #6 - arne_v
15. mar. 2012 20:29
#5

XPath er til XML ikke HTML.
Gravatar #8 - arne_v
15. mar. 2012 21:10
#7

Tja.

Det er en "group note" ikke en recommendation.

XPath som er en recommendation siger for 1.0 og 2.0:

http://www.w3.org/TR/xpath/


Abstract

XPath is a language for addressing parts of an XML document, designed to be used by both XSLT and XPointer.


http://www.w3.org/TR/2010/REC-xpath20-20101214/


Abstract

XPath 2.0 is an expression language that allows the processing of values conforming to the data model defined in [XQuery 1.0 and XPath 2.0 Data Model (Second Edition)]. The data model provides a tree representation of XML documents as well as atomic values such as integers, strings, and booleans, and sequences that may contain both references to nodes in an XML document and atomic values. The result of an XPath expression may be a selection of nodes from the input documents, or an atomic value, or more generally, any sequence allowed by the data model. The name of the language derives from its most distinctive feature, the path expression, which provides a means of hierarchic addressing of the nodes in an XML tree. XPath 2.0 is a superset of [XPath 1.0], with the added capability to support a richer set of data types, and to take advantage of the type information that becomes available when documents are validated using XML Schema. A backwards compatibility mode is provided to ensure that nearly all XPath 1.0 expressions continue to deliver the same result with XPath 2.0; exceptions to this policy are noted in [I Backwards Compatibility with XPath 1.0].


Gravatar #9 - Windcape
15. mar. 2012 21:19
#8

Men faktum er at det virker. XPath til DOM har virket i årevis (dokumentet er fra 2004).

JavaScript, PHP, og alle andre sprog jeg kender der har et DOM bibliotek understøtter xpath selection.
Gravatar #10 - Fifan
15. mar. 2012 21:25
Er der en som kan gøre så jeg ikke få kolonnen med?

Her er min kode:


<?php

<!-- class hentet fra Arne_v's link -->
include("simple_html_dom.php");

$html = str_get_html('

<!-- HTMl fra Post #1 -->

');

$newhtml = $html->find('table', -1);

/*** a new dom object ***/
$dom = new domDocument;

/*** load the html into the object ***/
@$dom->loadHTML($newhtml);

/*** discard white space ***/
$dom->preserveWhiteSpace = false;

/*** the table by its tag name ***/
$tables = $dom->getElementsByTagName('table');

/*** get all rows from the table ***/
$rows = $tables->item(0)->getElementsByTagName('tr');

/*** loop over the table rows ***/
foreach ($rows as $row)
{
/*** get each column by tag name ***/
$cols = $row->getElementsByTagName('td');

/*** echo the values ***/
echo $cols->item(0)->nodeValue.'<br />';
echo $cols->item(1)->nodeValue.'<br />';
echo $cols->item(2)->nodeValue.'<br />';
echo $cols->item(3)->nodeValue.'<br />';
echo $cols->item(4)->nodeValue.'<br />';
echo $cols->item(5)->nodeValue.'<br />';
echo '<hr />';
}

?>
Gravatar #11 - arne_v
15. mar. 2012 21:28
#9

PHP DOM extension er til XML.

Jeg har ingen anelse om JavaScript.
Gravatar #13 - reefermadness  
15. mar. 2012 22:27
Du kan bruge PHP's DOMDocument og XPath til at navigere rundt, men jeg har brugt simplehtmldom en del, og synes den er lettere at bruge, hvis du bare hurtigt skal scrape noget fra en side. den har en selector syntax der MINDER meget om sizzleJS (Jquery).
Gravatar #14 - Fifan
15. mar. 2012 22:40
#13 Ved du så om det er muligt i dette værktøj at angive hvor mange table tags den skal springe over fx ?
Gravatar #15 - arne_v
15. mar. 2012 22:54
#12

En XML parser til at parse HTML med - verden er af lave.
Gravatar #16 - reefermadness  
15. mar. 2012 23:28
Fifan (14) skrev:
#13 Ved du så om det er muligt i dette værktøj at angive hvor mange table tags den skal springe over fx ?

Edit: misforstod spørgsmålet
$tables = $dom->getElementsByTagName('table')->item(1);
Gravatar #17 - reefermadness  
15. mar. 2012 23:42
i simple html dom ville du nok gøre noget ala dette for at vælge alle tables der er child til den første table (hvis det er det du ønsker)

$tables = $html->find('table',0)->find('table');
Gravatar #18 - Fifan
16. mar. 2012 06:53
#17

Er det så også muligt i html dom at lave det som foreach så den looper hver <td> og som variabel. Lige som dom objektet i post #10 problemet med den kode er at jeg ikke kan få sorteret de første tables fra.

Gravatar #19 - reefermadness  
16. mar. 2012 08:03
#18 ja:

$dom = file_get_html($url);
$tables = $dom->find('table',0)->find('table');

foreach($tables as $i => $table){
echo "Tabel #$i:\n";
foreach($table->find('tr') as $row){
foreach($row->find('td') as $cell){
echo $cell->plaintext .' | ';
}
echo "\n";
}
echo "\n";
}
Gravatar #20 - Fifan
16. mar. 2012 08:59
#19 Det ser godt ud men er det muligt at få værdierne udskrevet enkeltvis med echo for hver td i det pågældende tr.

Eksempel:

foreach($row->find('td') as $cell){
echo $cell->plaintext .' | '; // række 1
echo $cell->plaintext .' | '; // række 2
echo $cell->plaintext .' | '; // række 3
}
Gravatar #21 - Fifan
17. mar. 2012 11:19
Denne kode gør hvad jeg har ønsket i forhold til at springe de to første tables over. Dog tager denne kode også den første tr med i tredje tabel og dette skal den ikke. Den skal starte fra anden tr.

Jeg har derfor prøvet at tilføje item(1) efter getElementsByTagName('tr')
Men det får jeg fejl på, det er som om at den kode kun kan skrives en gang.


$html = file_get_contents('content.html');

/*** a new dom object ***/
$dom = new domDocument;

/*** load the html into the object ***/
@$dom->loadHTML($html);

/*** discard white space ***/
$dom->preserveWhiteSpace = false;

/*** the table by its tag name ***/
$tables = $dom->getElementsByTagName('table');

/*** get all rows from the table ***/
$rows = $tables->item(2)->getElementsByTagName('tr');

/*** loop over the table rows ***/
foreach ($rows as $row)
{
/*** get each column by tag name ***/
$cols = $row->getElementsByTagName('td');

/*** echo the values ***/
echo $cols->item(0)->nodeValue.'<br />';
echo $cols->item(1)->nodeValue.'<br />';
echo $cols->item(2)->nodeValue.'<br />';
echo $cols->item(3)->nodeValue.'<br />';
echo $cols->item(4)->nodeValue.'<br />';
echo $cols->item(5)->nodeValue.'<br />';
echo '<hr />';
}
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login