使用PHP的explode()进行HTML抓取是不是很糟糕?

时间:2012-02-19 23:05:11

标签: php regex web-scraping

我已经编写了一段时间,但似乎无法理解正则表达式。

这让我想到了以下问题:使用PHP的爆炸分解一串html代码来选择文本位是不好的做法?我需要抓取一个页面来获取各种信息,并且由于我可怕的正则表达式知识(在一个完整的软件工程学位,我不得不写一个....)我决定使用explode()。

我在下面提供了我的代码,所以比我更有经验的人可以告诉我,为此我是否必须使用正则表达式!

public function split_between($start, $end, $blob)
{
    $strip = explode($start,$blob);
    $strip2 = explode($end,$strip[1]);
    return $strip2[0];
}

public function get_abstract($pubmed_id)
{
    $scrapehtml = file_get_contents("http://www.ncbi.nlm.nih.gov/m/pubmed/".$pubmed_id);
    $data['title'] = $this->split_between('<h2>','</h2>',$scrapehtml);
    $data['authors'] = $this->split_between('<div class="auth">','</div>',$scrapehtml);
    $data['journal'] = $this->split_between('<p class="j">','</p>',$scrapehtml);
    $data['aff'] = $this->split_between('<p class="aff">','</p>',$scrapehtml);
    $data['abstract'] = str_replace('<p class="no_t_m">','',str_replace('</p>','',$this->split_between('<h3 class="no_b_m">Abstract','</div>',$scrapehtml)));
    $strip = explode('<div class="ids">', $scrapehtml);
    $strip2 = explode('</div>', $strip[1]);
    $ids[] = $strip2[0];
    $id_test = strpos($strip[2],"PMCID");
    if (isset($strip[2]) && $id_test !== false)
    {
        $step = explode('</div>', $strip[2]);
        $ids[] = $step[0];
    }
    $id_count = 0;
    foreach ($ids as &$value) {
        $value = str_replace("<h3>", "", $value);
        $data['ids'][$id_count]['id'] = str_replace("</h3>", "", str_replace('<span>','',str_replace('</span>','',$value)));
        $id_count++;
    }

    $jsonAbstract = json_encode($data);

    echo $this->indent($jsonAbstract);
}

3 个答案:

答案 0 :(得分:3)

我强烈建议您试用PHP Simple HTML DOM Parser库。它处理无效的HTML,旨在解决您正在处理的同样问题。

the documentation的一个简单示例如下:

// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

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

// Find all links 
foreach($html->find('a') as $element) 
       echo $element->href . '<br>';

答案 1 :(得分:1)

使用正则表达式并不是必需的,尽管熟悉它们并知道何时使用它们会很有用。

看起来你正在刮你的PubMed,我猜它在标记方面有相当静态的标记。如果你有什么工作和表现,你希望我看不出有任何理由切换到使用正则表达式,在这个例子中它们不一定会更快。

答案 2 :(得分:-1)

学习正则表达式并尝试使用具有此类任务库的语言,如perl或python。它会为你节省很多时间。 起初它们可能看起来令人生畏,但它们对于大多数任务来说非常容易。 请尝试阅读:http://perldoc.perl.org/perlre.html