使用 PHP 解析 HTML Table 来自 XML 的数据
Parsing HTML Table Data from XML with PHP
我对 PHP 有点陌生,但鉴于我的情况,我不能真正理解我在这里做错了什么。
问题:我正在尝试通过 Reddit 获取 XML object/element 中的字符串中某个 HTML 元素的 href(如果您访问此页面,它将是视频的实际 link - 不是 reddit link 而是外部 youtube link 或其他任何东西 - 没有别的)。
到目前为止,这是我的代码(代码已更新):
更新:循环狂热!获得了所有 href,但我现在正试图将它们存储在一个全局数组中以访问此函数之外的随机数组。
function getXMLFeed() {
echo "<h2>Reddit Items</h2><hr><br><br>";
//$feedURL = file_get_contents('https://www.reddit.com/r/videos/.xml?limit=200');
$feedURL = 'https://www.reddit.com/r/videos/.xml?limit=200';
$xml = simplexml_load_file($feedURL);
//define each xml entry from reddit as an item
foreach ($xml -> entry as $item ) {
foreach ($item -> content as $content) {
$newContent = (string)$content;
$html = str_get_html($newContent);
foreach($html->find('table') as $table) {
$links = $table->find('span', '0');
//echo $links;
foreach($links->find('a') as $link) {
echo $link->href;
}
}
}
}
}
XML代码:
http://pasted.co/0bcf49e8
如果可以的话,我也包括了 JSON;我只是更喜欢 XML:
http://pasted.co/f02180db
这就是几乎所有的代码。不过,这是我尝试与 DOMDocument 一起使用的另一篇文章(已废弃)。
foreach ($item -> content as $content) {
$dom = new DOMDocument();
$dom -> loadHTML($content);
$xpath = new DOMXPath($dom);
$classname = "/html/body/table[1]/tbody/tr/td[2]/span[1]/a";
foreach ($dom->getElementsByTagName('table') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
//$originalURL = $node->getAttribute('href');
}
//$html = $dom->saveHTML();
}
我可以很好地解析 table,但是在获取某些元素的值时(没有 ID 或 class),我似乎只能获取所有锚标记或所有 table行等
任何人都可以指出我正确的方向吗?让我知道是否还有其他我可以在这里添加的内容。谢谢!
已添加 HTML:
我专门尝试从每个 table/item 中提取 <span><a href="https://www.youtube.com/watch?v=nZC4mXaosxM">[link]</a></span>
。
http://pastebin.com/QXa2i6qz
如果您要查找特定元素,则无需解析整个元素。一种方法是使用 DOMXPath class 并直接查询 xml。该文档应指导您完成。
以下代码可以从每个内容中提取所有 youtube 链接。
function extract_youtube_link($xml) {
$entries = $xml['entry'];
$videos = [];
foreach($entries as $entry) {
$content = html_entity_decode($entry['content']);
preg_match_all('/<span><a href="(.*)">\[link\]/', $content, $matches);
if(!empty($matches[1][0])) {
$videos[] = array(
'entry_title' => $entry['title'],
'author' => preg_replace('/\/(.*)\//', '', $entry['author']['name']),
'author_reddit_url' => $entry['author']['uri'],
'video_url' => $matches[1][0]
);
}
}
return $videos;
}
$xml = simplexml_load_file('reddit.xml');
$xml = json_decode(json_encode($xml), true);
$videos = extract_youtube_link($xml);
foreach($videos as $video) {
echo "<p>Entry Title: {$video['entry_title']}</p>";
echo "<p>Author: {$video['author']}</p>";
echo "<p>Author URL: {$video['author_reddit_url']}</p>";
echo "<p>Video URL: {$video['video_url']}</p>";
echo "<br><br>";
}
多维数组格式的代码输出为entry_title
、author
、author_reddit_url
和video_url
。希望对你有帮助!
我对 PHP 有点陌生,但鉴于我的情况,我不能真正理解我在这里做错了什么。
问题:我正在尝试通过 Reddit 获取 XML object/element 中的字符串中某个 HTML 元素的 href(如果您访问此页面,它将是视频的实际 link - 不是 reddit link 而是外部 youtube link 或其他任何东西 - 没有别的)。
到目前为止,这是我的代码(代码已更新):
更新:循环狂热!获得了所有 href,但我现在正试图将它们存储在一个全局数组中以访问此函数之外的随机数组。
function getXMLFeed() {
echo "<h2>Reddit Items</h2><hr><br><br>";
//$feedURL = file_get_contents('https://www.reddit.com/r/videos/.xml?limit=200');
$feedURL = 'https://www.reddit.com/r/videos/.xml?limit=200';
$xml = simplexml_load_file($feedURL);
//define each xml entry from reddit as an item
foreach ($xml -> entry as $item ) {
foreach ($item -> content as $content) {
$newContent = (string)$content;
$html = str_get_html($newContent);
foreach($html->find('table') as $table) {
$links = $table->find('span', '0');
//echo $links;
foreach($links->find('a') as $link) {
echo $link->href;
}
}
}
}
}
XML代码: http://pasted.co/0bcf49e8
如果可以的话,我也包括了 JSON;我只是更喜欢 XML: http://pasted.co/f02180db
这就是几乎所有的代码。不过,这是我尝试与 DOMDocument 一起使用的另一篇文章(已废弃)。
foreach ($item -> content as $content) {
$dom = new DOMDocument();
$dom -> loadHTML($content);
$xpath = new DOMXPath($dom);
$classname = "/html/body/table[1]/tbody/tr/td[2]/span[1]/a";
foreach ($dom->getElementsByTagName('table') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
//$originalURL = $node->getAttribute('href');
}
//$html = $dom->saveHTML();
}
我可以很好地解析 table,但是在获取某些元素的值时(没有 ID 或 class),我似乎只能获取所有锚标记或所有 table行等
任何人都可以指出我正确的方向吗?让我知道是否还有其他我可以在这里添加的内容。谢谢!
已添加 HTML:
我专门尝试从每个 table/item 中提取 <span><a href="https://www.youtube.com/watch?v=nZC4mXaosxM">[link]</a></span>
。
http://pastebin.com/QXa2i6qz
如果您要查找特定元素,则无需解析整个元素。一种方法是使用 DOMXPath class 并直接查询 xml。该文档应指导您完成。
以下代码可以从每个内容中提取所有 youtube 链接。
function extract_youtube_link($xml) {
$entries = $xml['entry'];
$videos = [];
foreach($entries as $entry) {
$content = html_entity_decode($entry['content']);
preg_match_all('/<span><a href="(.*)">\[link\]/', $content, $matches);
if(!empty($matches[1][0])) {
$videos[] = array(
'entry_title' => $entry['title'],
'author' => preg_replace('/\/(.*)\//', '', $entry['author']['name']),
'author_reddit_url' => $entry['author']['uri'],
'video_url' => $matches[1][0]
);
}
}
return $videos;
}
$xml = simplexml_load_file('reddit.xml');
$xml = json_decode(json_encode($xml), true);
$videos = extract_youtube_link($xml);
foreach($videos as $video) {
echo "<p>Entry Title: {$video['entry_title']}</p>";
echo "<p>Author: {$video['author']}</p>";
echo "<p>Author URL: {$video['author_reddit_url']}</p>";
echo "<p>Video URL: {$video['video_url']}</p>";
echo "<br><br>";
}
多维数组格式的代码输出为entry_title
、author
、author_reddit_url
和video_url
。希望对你有帮助!