【问题标题】:impossible to html parsing facebook public profile with php不可能用 php 来 html 解析 facebook 公共配置文件
【发布时间】:2011-09-06 16:25:09
【问题描述】:

我从这个网址抓取了一个 html:http://facebook.com/zuck 将它回显到客户端浏览器没有问题,但我发现用 php 解析它是不可能的。

例如,我正在尝试解析 div 标签内的文本:

preg_match_all("/<div class=\"mediaPageName\">(.*)<\/div>/",$html,$matches);
print_r($matches);

返回空数组 我还尝试使用 DOMDocument 和 PHP Simple HTML DOM Parser,它们都返回空元素并且无法获取 html 的文本。

这怎么可能? 有解决办法吗?

【问题讨论】:

  • 抓取可能违反了 ToS。如果可能,最好使用图形 API:graph.facebook.com/zuck
  • @Frank Farmer 也许是真的,但考虑到 Facebook 的所有隐私问题,担心 Facebook 违反 ToS 是很讽刺的。

标签: php html facebook parsing


【解决方案1】:

很有可能。

最简单的方法是将完整的 DOM 加载到 DOMDocument 或phpQuery

编辑:

通过查看所提供链接的源代码,您正在搜索的元素正在替换小于字符的 &lt; 为 unicode 表示:\u003c

示例:\u003cdiv class=\"mediaPageName\"&gt;Nirvana\u003c\/div&gt;

编辑 2:
正如其他人所提到的,在不必要的时候不要解析 HTML。但正如 Frank Farmer 所提到的,在这种情况下,这似乎是必需的。

这个正则表达式会找到一些匹配项(每行只有一个,希望有人可以调整它以获得所有匹配项)。 preg_match_all('%\\\\u003cdiv class=.*mediaPageName[^&gt;]*&gt;([^&gt;]*)\\\\u003c%i', $html, $matches);

了解如何使用here 概述的 Unicode 正则表达式可能是值得的。

【讨论】:

  • @Brad F Jacobs 我明白了,但这并不意味着它不是正确的解决方案 - 可以使用 DOMDocument 轻松完成。
  • @brian_d 即使我只做preg_match('/mediaPageName/',$html) 它也会返回false,但是我用echo 进行了检查,我可以用我的眼睛看到带有mediaPageName 类的div 元素。我不明白。
  • @brian_d 我试图将它加载到 DOMDocument 中,但它不起作用。
  • @Ben preg_match 应该返回一个数字,并且仅在错误时返回 false。 php.net/manual/en/function.preg-match.php。您需要模式分隔符 - 例如)'/mediaPageName/'
  • @Ben 看看我更新的答案,看起来您正在寻找的 div 以 unicode \u003c 输出 &lt; 符号
【解决方案2】:

如果您只使用Graph API,从长远来看,您可能会变得更好。头像和一些基本账户信息是公开的,不需要认证或授权。例如,只需发出http://graph.facebook.com/zuck/picture 的请求。

【讨论】:

  • 我知道了,但我无法从图形 api 中获取我需要的所有数据。我的问题有解决方案吗?
  • 解决方法是说“哦,好吧”。屏幕抓取 Facebook 最终会以眼泪收场。
【解决方案3】:
$html = str_replace(array('\u003c','\"','\/'), array('<','"','/'), $html);
preg_match_all('/<div class=\"mediaPageName\">(.*?)<\/div>/', $html, $matches); 
var_dump($matches);

必须是用一行 preg_match 而不是上面的代码来做的一种方法,并且还要抓住这个标签&lt;span class="fwb"&gt;text&lt;/span&gt;,但我不知道如何将它写在一行中。

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多