【问题标题】:Parsing specific data items from website从网站解析特定数据项
【发布时间】:2012-05-25 22:29:39
【问题描述】:

我试图从this webpage检索以下数据变量

  • 地址
  • 城市
  • 状态
  • 邮政编码
  • 商店电话
  • 药房电话
  • 开放时间
  • 药房营业时间
  • 取货选项
  • 在这个商店/位置
  • 站点到存储时间

我尝试过这种方式,但是我无法分离出一些数据来存储在上述数据变量中,所以需要一些 PHP 专家的帮助和建议

 $html = file_get_html('http://www.walmart.com/storeLocator/ca_storefinder_results.do?serviceName=&rx_title=com.wm.www.apps.storelocator.page.serviceLink.title.default&rx_dest=%2Findex.gsp&sfrecords=50&sfsearch_single_line_address=K6T');
foreach($html->find('div[class=StoreAddress] div[1]') as $name)
{
echo $name->innertext.'<br>';
}

这个网站的 html 很难用它的标签来识别每个数据项,因为它们没有分配给标签的正确 id。任何人都可以建议简单且可扩展的方法来解析来自 website 的上述数据项。

谢谢

【问题讨论】:

  • 其实问题是很多标签有相同的类名,或者有些标签没有任何id或类来识别..所以一些不需要的数据也被解析了......我很困惑哪个数据存储在哪个变量中,因为它们都有相同的标签、类和没有 id..

标签: php parsing screen-scraping web-scraping


【解决方案1】:

我看到他们在地址之前实现了一个不错的 hr 标签。 在 hr 标签上展开它并使用带有地址的剩余部分来重建 html 对象。 然后遍历 div 并使用 preg_match 来查看对象是否包含对您想要的数据的任何引用。

foreach($html->find(’div’) as $test)
    {
     if(preg_match(’/Adress/’,$test->innertext))
        {
        filter out addy
        }
    }

【讨论】:

  • 嗯,你知道explode怎么用吗?爆炸后得到第二块数组。然后用剩余部分构建 html 对象。
【解决方案2】:

html 并没有那么复杂。 php 的迭代器和 dom/regex 函数对于这样的任务很笨拙,但可以做到:

$dom = new DOMDocument();
@$dom->loadHTMLFile('http://www.walmart.com/storeLocator/ca_storefinder_details_short.do?rx_dest=/index.gsp&rx_title=com.wm.www.apps.storelocator.page.serviceLink.title.default&edit_object_id=2092&sfsearch_single_line_address=K6T');
$xpath = new DOMXPath($dom);

foreach($xpath->query('//div[@class="StoreAddress"]') as $div) {
  // title
  echo $xpath->query(".//div[1]", $div)->item(0)->nodeValue . "\n";
  // street
  echo $xpath->query(".//div[2]", $div)->item(0)->nodeValue . "\n";
  // city state and zip
  preg_match('/(.*), ([A-Z]{2}) (\d{5})/', $xpath->query(".//div[3]", $div)->item(0)->nodeValue, $m);
  // city
  echo $m[1] . "\n";
  // state
  echo $m[2] . "\n";
  // zip
  echo $m[3] . "\n";
}

【讨论】:

  • 感谢 pguardiario!但我已经在问题中给出的代码中做了同样的事情。因为它们是标签中使用的类“StoreAddress”,而且很简单。问题是要获取我在项目符号列表中提到的数据项...(商店电话,-药房电话,-营业时间,-药房营业时间,取货选项,在此商店/位置,站点到商店营业时间)....你能告诉我类似的代码吗?
  • 我想对很多其他页面进行同样的抓取......例如:walmart.com/storeLocator/…。你能帮我怎么做吗?这样我就可以对其他商店重复相同的过程...谢谢
  • 实际上,如果您查看源代码,所有内容都在不错的 javascript 变量中,解析出来可能更容易。
  • 你说得对,这很简单,实际上我在谈论其他问题,我无法解析表中的其他数据项,因为这些在同一类的 标记中,可以请只给我看其中之一。 (例如:在这个位置用 3 个单独的变量解析 Pharmacy Hours 、 Pickup Options )我试过但没能做到。如果您能帮我解决这个问题,我将不胜感激。
  • 就像我说的,它可以在 php 中完成,但我为你做这件事对我来说太痛苦了。你真的应该为此使用 python 或 ruby​​。
【解决方案3】:

试用simple_html_dom 库。 在页面上,有一些简单的示例可以帮助您快速入门。

我已经成功地将它用于您正在尝试做的事情。

【讨论】:

  • 是的 Siim 你是对的,但我之前已经做过同样的工作,此时我有一个与 标签相关的特定问题,这些标签既没有 id 也没有特定的类可以识别.所以我无法获取变量,例如(电话号码、在此位置、取件选项等)
  • @wqs 你可以遍历所有 s。使用正则表达式模式来确定内容的类型(位置、时间或...)。而不是正则表达式,只检查像“商店营业时间”这样的固定标题也可以工作,因为您知道以下字段中的数据是什么。
猜你喜欢
相关资源
最近更新 更多
热门标签