【问题标题】:Scraping with xpath使用 xpath 进行抓取
【发布时间】:2017-04-28 16:25:44
【问题描述】:

我正在尝试使用 DOMXPath 获取搜索结果的项目。下面是一个包含 4 个结果元素的搜索结果示例:

https://www.11880.com/suche/0521441422/deutschland

现在使用以下代码,我得到了 4 个元素的那些,但我不知道如何获取元素中的每个项目(如名称、街道等)。

你能帮我解决这个问题吗?

$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, 'https://www.11880.com/suche/0521441422/deutschland'); 
$page = curl_exec($ch);

$dom = new DOMDocument();
$dom->loadHTML($page);
$xpath = new DOMXPath($dom);

foreach($xpath->query('//li[@class="search-result-list-item"]') as $item)
{
    echo trim($item->nodeValue).'<br>';
}

【问题讨论】:

  • 如果您设法解决了问题,请告诉我,GL

标签: php xpath web-scraping scrape


【解决方案1】:

我猜你可以使用:

$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, 'https://www.11880.com/suche/0521441422/deutschland');
$page = curl_exec($ch);

libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML($page);
$xpath = new DOMXPath($dom);

$results = [];
$results['name'] = $xpath->query('//h2[@itemprop="name"]');
$results['street-name'] = $xpath->query('//span[@class="street-address"]');
$results['postal-code'] = $xpath->query('//span[@class="postal-code"]');
$results['address-locality'] = $xpath->query('//span[@class="address-locality"]');
$results['quarter'] = $xpath->query('//span[@class="quarter"]');

for($x=0; $x < $results['name']->length;$x++)
{
    print trim($results['name']->item($x)->textContent);
    print trim($results['street-name']->item($x)->textContent);
    print trim($results['postal-code']->item($x)->textContent);
    print trim($results['address-locality']->item($x)->textContent);
    print trim($results['quarter']->item($x)->textContent)."\n";
}

输出:

Brauer, Harald Dr.med. Hals- Nasen- OhrenarztHauptstr. 9233647Bielefeld(Brackwede)
Elies-Kramme, Sybille Dr.med. Fachärztin für HNO-HeilkundeHauptstr. 9233647Bielefeld(Brackwede)
Gemeinschaftspraxis HNO-Bielefeld-Süd ÜBAG Michael K.W. Stolle und Dr. Sybille Elies-KrammeHauptstr. 9233647Bielefeld(Brackwede)
Stolle, Michael K. W. Facharzt für HNO-HeilkundeHauptstr. 9233647Bielefeld(Brackwede)

【讨论】:

  • 嗨佩德罗,当每个参数一直存在时,这非常有效。位如何添加列表的每个条目中不存在的参数:在此示例中,它将是“营业时间”。如果我只是像其他参数一样添加希望,它会与错误的业务相关。因此,在这种情况下,添加这条额外的行并稍后打印它会“连接”前 3 个营业时间的企业,即使它应该是最后 3 个企业。 $results['opening_hours'] = $xpath->query('//span[@class="open-or-closed"]');
猜你喜欢
  • 2015-11-03
  • 1970-01-01
  • 2012-03-08
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2014-04-25
相关资源
最近更新 更多