Обработка на string с html

hatre

Active Member
Трябва ми да вземам определена информация от различни сайтове и не знам как сред многото html да направя така че да взема само това което ми трябва или да махна излишното. Ето един примерен код

HTML:
<div id="content">
    <div class="entry jpibfi_container">
        <iframe src="…"><iframe>
         <p id="tozi">Този текст трябва да взема</p>
    </div>
    <div id="img">
        <img src="..."></img>
        <p>Описание на картинката</p>
    </div>
    <p>Този текст трябва да взема</p>
</div>

Четох за RegExp но с него не намирам как да вземам или магам цели div-ове или тагове с определени id и class, като например това

HTML:
 <p id="tozi">Този текст трябва да взема</p>

Има ли нещо като jQuery('.myclass p').html(); само че да работи са string?
 
От: Обработка на string с html

И като го вземеш чрез JS после какво ще го правиш? не вярвам да искаш всеки път да четеш цяла страницата за да вземеш съдържание.
За примера, който си дал:
$('#content p').last().html();

Запознай се какво е DOM и чак след това идва частта с извличането на данни.
 
От: Обработка на string с html

PHP:
<?php
$content = "";
$doc = new DOMDocument();
$doc->load("example.html");
$items = $doc->getElementsByTagName('tag1');
if(count($items) > 0) //Only if tag1 items are found 
{
    foreach ($items as $tag1)
    {
         // Do something with $tag1->nodeValue and save your modifications
         $content .= $tag1->nodeValue;
    }
}
else
{
     $content = $doc->saveHTML();
}
echo $content;
?>
 
От: Обработка на string с html

Не си уточнил какъв точно е критерия, по който се познава кой текст трябва да се вземе. Ето ти пример що годе съобразен с html-a, който си дал.
PHP:
$doc = new DOMDocument();
@$doc->loadHTML( $html );

$paras = $doc->getElementsByTagName('p');
foreach( $paras as $para) {
        if ( $paras ->getAttribute('id') == 'tozi' ) {
              ....
        }
}

Принципно зарежи тая работа с regexp-овете. DOM и XPath са твоите най-добри приятели.
 
От: Обработка на string с html

@тео за да се получи това, което се иска трябва да се добави и ползването на DOMXpath ;)
 
От: От: Обработка на string с html

Благодаря на всички, ще видя това DOM, аз идея нямам какво е само съм го чувал. Целта на моето занятие ще е да отворя в 100 таба, 100 поста на някой сайт и с imacроs и html файл, да се копва съдържание и картинки и да се слагам в сайт. Много път съм го правил но не с всеки сайт мога да филтрирам каквото ми трябва и за това питах.


Не си уточнил какъв точно е критерия, по който се познава кой текст трябва да се вземе.
Не уточних защото в някой случаи става така че админа на някой сайт като е копирал от друг е изкопирал div-ове и положението се усложнява :D
 
От: Обработка на string с html

Ако сайтовете, от които ще теглиш инфото, не са стандартизирани и имат много грешки в кода, тогава с DOM-а може да удариш на камък. Регулярните изрази вървят навсякъде, но пък иска повече писане и тестове.
 
От: Обработка на string с html

Това DOM определено върши работа, вече имам някакъв напредък - взех клас entry и в него махнах таговете script и някои класове които не ме интересуват. Сега трябва да разбера как да правя от един DOM няколко DOM-а, които да обработвам и да обединявам. Само дето всичко ми се струва много объркано и изнервящо , както всяко ново и непознато нещо.
 
От: Обработка на string с html

@madseason няма акова животно като да удариш на камък ако работиш с DOM дървото ;).

@hatre да правиш няколко DOM-а?
Искаш от една страница да вземеш съдържанието от няколко елемента ли?
 
От: Обработка на string с html

@madseason няма такова животно като да удариш на камък ако работиш с DOM дървото ;).

@hatre да правиш няколко DOM-а?
Искаш от една страница да вземеш съдържанието от няколко елемента ли?

Вече нямам проблеми, мога да взема тагове, класове и техните атрибути. Накрая каквото остане с регулярните го оправям и става работата. Мислих си как имам dom с този код:

HTML:
<div class="class1">някакъв код</div>
<h2>Заглавие</h2>
<div class="class1">някакъв код</div>

Как мода да направя още един dom, който да вземе всичко от <h2> надолу? По някакъв начин да му задам търсен код и да го разделя на две, както прави explode със стринговете.
 
От: Обработка на string с html

@madseason няма акова животно като да удариш на камък ако работиш с DOM дървото ;).
Охооо, де да беше толкова хубаво! Явно не си работил много със скрапване на счупени сайтове. В най-лекия случай при леко наакан HTML-код се появява първо това:
Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: Opening and ending tag mismatch: font and td in http:...
В някои случаи просто заобикаляш проблема с "@". И ако скрапнатата информация е коректна, си пиеш биричката аляшки. Но в повечето случаи се налага използването на RegEx-и.
Доста сайтове съм свалял директно до база данни, за да са ми познати повече магарии, които може да ти изсипе DOM-скраппинга. Иначе и аз ползваам предимно XPath 1.0 - най-бързо и лесно, но и с най-много изненади. Особено за стари тимплейти, където има наблъскани <font>, <br>, <td>, други незатворени тагове... Или сйтове, които ползват визуални редактори, там потребителя може да трие, да минава от код във визуален режим и обратно и става мазало с валидацията на кода.
 
От: Обработка на string с html

Аз чак такива с незатворени тагове няма да имам, моите ще са елементарни. Да ако сайта е мазало, ще има бая ядове, но ти като си толкова алчен да сваляш всичко няма начин :D Преди години един приятел така сваляше много сайтове, но те неговите програми направо ходиха по линковете на конкретния сайт и по цял ден сваляше с .net c#, вика събуждам са в 22 часа той забил, оправям го събуждам са в 3 той пак забил :D
 
От: Обработка на string с html

@madseason и? Като си свалял толкова много не знаеш решението ли?
Ако сайта е мазало просто ще ства по трудно :).

@hatre какво ползваш: js, php, perl, python... ?
Тъй като гледам по-горе има примери с php ето ти един:
Код:
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath    = new DOMXpath($dom);
$elements = $xpath->query('//div[contains(@class, "something")]//p');
if (!is_null($elements)) {
 foreach ($elements as $key => $element) {
   $tmp = $element->childNodes;    
   $eNodes = $xpath->query('.//h2', $tmp->item(0) );
   // do something
 }
}

Пак ти казвма не правиш "думове" :), а търсене в DOM дървото. Ако пък ти трябва елемент който е извън този който си "маркирал" първоначално просто имаш друга маска.
 
От: Обработка на string с html

@AMitrev Мерси ще го видя кода, а ти php, perl, python всички тези ли ползваш?
 
От: Обработка на string с html

Езика няма значение. Ползва се това, което дава най-доброто решение на проблема.
 
От: Обработка на string с html

Принципно да, но се иска доста докато се стигне до това ниво. На мен едно време 3 месеца ми от да науча какво е масив на c++ и това не ми беше достатъчно да разбера че не ме бива за това :D Разбрах това едва в следващите 3 години, но от време на време нещо ми прищраква и продължавам да се мъча.
 
От: Обработка на string с html

Това става малко трудно иска се четене и ровене в кода.
 

Горе