天道酬勤,学无止境

TreeBuilder 获取嵌入节点(TreeBuilder Get embedded nodes)

问题

基本上,我需要在 HTML 代码中获取所有这些人的姓名和电子邮件。

<thead>
        <tr>
            <th scope="col" class="rgHeader" style="text-align:center;">Name</th><th scope="col" class="rgHeader" style="text-align:center;">Email Address</th><th scope="col" class="rgHeader" style="text-align:center;">School Phone</th>
        </tr>
    </thead><tbody>
    <tr class="rgRow" id="ctl00_ContentPlaceHolder1_rg_People_ctl00__0">
        <td>
                            Michael Bowen
                        </td><td>mbowen@cpcisd.net</td><td>903-488-3671 ext3200</td>
    </tr><tr class="rgAltRow" id="ctl00_ContentPlaceHolder1_rg_People_ctl00__1">
        <td>
                            Christian Calixto
                        </td><td>calixtoc@cpcisd.net</td><td>903-488-3671 x 3430</td>
    </tr><tr class="rgRow" id="ctl00_ContentPlaceHolder1_rg_People_ctl00__2">
        <td>
                            Rachel Claxton
                        </td><td>claxtonr@cpcisd.net</td><td>903-488-3671 x 3450</td>
    </tr>
    </tbody>

</table><input id="ctl00_ContentPlaceHolder1_rg_People_ClientState" name="ctl00_ContentPlaceHolder1_rg_People_ClientState" type="hidden" autocomplete="off">    </div>


        <br>

我知道如何将 treebuilder 与节点等一起使用,并且我在我的一些脚本中使用了此代码。

    my ($file) = @_;
my $html = path($file)-> slurp;
my $tree = HTML::TreeBuilder->new_from_content($html);
my @nodes = $tree->look_down(_tag => 'input');
my $val;
foreach my $node (@nodes) {
    $val = $node->look_down('name', qr/\$txt_Website/)->attr('value');
}
return $val;

我打算对这个函数使用相同的代码,但我意识到我没有太多要搜索的东西,因为<td>标签在脚本中的许多其他地方。 我确信有更好的方法来解决这个问题,但我似乎找不到它。

HTML 代码链接:http://pastebin.com/qLwu80ZW

我的代码:https://pastebin.com/wGb0eXmM

注意:我确实尽可能多地在 google 上查找,但我不太确定我应该搜索什么。

回答1

包含您需要的数据的table元素具有唯一的类rgMasterTable因此您可以在look_down搜索

我写这个是为了证明。 它直接从您的粘贴箱中提取 HTML

use strict;
use warnings 'all';

use LWP::Simple 'get';
use HTML::TreeBuilder;

use constant URL => 'http://pastebin.com/raw/qLwu80ZW';

my $tree = HTML::TreeBuilder->new_from_content(get URL);

my ($table) = $tree->look_down(_tag => 'table', class => 'rgMasterTable');

for my $tr ( $table->look_down(_tag => 'tr') ) {

    next unless my @td = $tr->look_down(_tag => 'td');

    my ($name, $email) = map { $_->as_trimmed_text } @td[0,1];

    printf  "%-17s %s\n", $name, $email;
}

输出

Michael Bowen     mbowen@cpcisd.net
Christian Calixto calixtoc@cpcisd.net
Rachel Claxton    claxtonr@cpcisd.net

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用树图将嵌套单元格绘制为树:MATLAB(Ploting a nested cell as a tree using treeplot: MATLAB)
    问题 我有一个表示树结构的复杂单元格: CellArray = {1,1,1,{1,1,1,{1,1,{1,{1 1 1 1 1 1 1 1}, 1,1}, 1,1},1,1,1},1,1,1,{1,1,1,1}}; 我想使用treeplot(p)从中绘制代表树,但我不确定如何构造数组p以使其正确显示。 回答1 我们可以创建一个递归函数,它探索您的元胞数组并为每个节点的父节点创建一个树指针数组(如文档中所述)。 此函数采用一个元胞数组(如您问题中的那个),其中包含标量或嵌套元胞数组。 treebuilder逻辑: 如果项目是标量,则为其分配一个父节点编号,节点编号加 1 如果项目是元胞数组, treebuilder在该元treebuilder上运行treebuilder ,返回达到的最大节点数(以及生成的子树)。 递归函数因为第2步,所以重复直到每个元素都完成 功能: function treearray = getTreeArray(cellarray) % initialise the array construction from node 0 treearray = [0, treebuilder(cellarray, 1)]; % recursive tree building function, pass it a cell array and root node
  • Perl 中的 Grep 和提取数据(Grep and Extract Data in Perl)
    问题 我将 HTML 内容存储在一个变量中。 如何提取在页面中一组常见标记之间找到的数据? 例如,我对数据感兴趣(由DATA表示保存在一组标记之间,一行一行: ... <td class="jumlah">*DATA_1*</td> <td class="ud"><a href="">*DATA_2*</a></td> ... 然后我想在哈希中存储映射 DATA_2 => DATA_1 回答1 因为它是 HTML,所以您可能希望使用 XPath 模块来处理 HTML,HTML::TreeBuilder::XPath。 首先,您需要使用 HTML::TreeBuilder 方法解析您的字符串。 假设您网页的内容位于名为$content的变量中,请执行以下操作: my $tree = HTML::TreeBuilder->new; $tree->parse_file($file_name); 现在您可以使用 XPath 表达式在您关心的节点上获取迭代器。 第一个表达式获取html元素中body table中tr中的所有td节点: my $tdNodes = $tree->findnodes('/html/body/table/tr/td'); 最后,您可以遍历循环中的所有节点以找到您想要的: foreach my $node ($tdNodes->get_nodelist) { my
  • TreeBuilder Get embedded nodes
    Basically, I need to get the names and emails from all of these people in the HTML code. <thead> <tr> <th scope="col" class="rgHeader" style="text-align:center;">Name</th><th scope="col" class="rgHeader" style="text-align:center;">Email Address</th><th scope="col" class="rgHeader" style="text-align:center;">School Phone</th> </tr> </thead><tbody> <tr class="rgRow" id="ctl00_ContentPlaceHolder1_rg_People_ctl00__0"> <td> Michael Bowen </td><td>mbowen@cpcisd.net</td><td>903-488-3671 ext3200</td> </tr><tr class="rgAltRow" id="ctl00_ContentPlaceHolder1_rg_People_ctl00__1"> <td> Christian Calixto <
  • 实践 - 使用Python画一棵递归分形树
    本实践中,作者要介绍用Python在Tkinter上画一棵树的方法。通过本实践,读者可以:练习面向对象的程序设计方法;了解生成器的使用方法;运用递归函数;了解Tkinter画图的基本方法;以及学习“树”这种重要的数据结构。 版权声明 本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。 本文不可以以纸质出版为目的进行改编、摘抄。 本文节选自作者的《Python编程基础及应用》视频教程。 本实践中,作者要介绍用Python在Tkinter上画一棵树的方法。通过本实践,读者可以:练习面向对象的程序设计方法;了解生成器的使用方法;运用递归函数;了解Tkinter画图的基本方法;以及学习“树”这种重要的数据结构。 ​ 在本书配套的网站上,你可以下载到本实践的全部代码。本章要画的图“大概”长成下面这样。为什么说是大概呢? 因为树的结构是在一定约束条件下随机生成的。 1. 数据结构 - 树 ​ 要完成本实践,读者首先要了解一点数据结构 - data structure的知识。数据结构大概是指计算机内部表达和组织数据的方式。 1.1 树 ​ 树-Tree是一种数据结构,它用于模拟真实世界中的树形结构,通常描绘成上图的样子。为了说明方便,作者把每个节点用字母作了标识。 ​ T是一棵树,树上的每个圆圈称之为一个节点-node,其中,a是树T的根节点 - root
  • 使用 Symfony2 配置类,如何定义其子节点没有键的数组节点?(Using the Symfony2 configuration class, how do I define an array node whose children don't have keys?)
    问题 使用配置类,如何定义一个没有数字键的数组节点? 阵列的孩子不代表进一步的配置选项。 相反,它们将是一个不能被选择性覆盖的列表,只能作为一个整体。 到目前为止,我有: public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder; $root = $treeBuilder->root('acme_base'); $root ->children() ->arrayNode('entities') // Unfortunately, this doesn't work ->defaultValue(array( 'Acme\BaseBundle\Entity\DefaultEntity1', 'Acme\BaseBundle\Entity\DefaultEntity2', )) ->end() ->end(); return $treeBuilder; } 在app/config.yml ,我希望能够像这样覆盖它: acme_base: entities: - 'Acme\BaseBundle\Entity\AnotherEntity1' - 'Acme\BaseBundle\Entity\AnotherEntity2' - 'Acme\BaseBundle\Entity
  • 使用 Perl 解析 html(Parse html using Perl)
    问题 我有以下 HTML- <div> <strong>Date: </strong> 19 July 2011 </div> 我一直在使用 HTML::TreeBuilder 来解析使用标签或类的 html 的特定部分,但是上述 html 使我难以仅提取日期。 例如我试过- for ( $tree->look_down( '_tag' => 'div')) { my $date = $_->look_down( '_tag' => 'strong' )->as_trimmed_text; 但这似乎与<strong>.的早期使用相冲突<strong>. 我只想解析“2011 年 7 月 19 日”。 我已经阅读了关于 TreeBuilder 的文档,但找不到这样做的方法。 如何使用 TreeBuilder 执行此操作? 回答1 “转储”方法对于找到绕过 HTML::TreeBuilder 对象的方法非常有用。 此处的解决方案是获取您感兴趣的元素的父元素(在本例中为 <div>)并遍历其内容列表。 您感兴趣的文本将是纯文本节点,即列表中不引用 HTML::Element 对象的元素。 #!/usr/bin/perl use strict; use warnings; use HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new;
  • 【数据结构】-树及森林 菜单实现 深度优先 广度优先 递归遍历
    前言:树是一种非常有趣的数据结构,在大学时期有学过,但缺乏实际运用场景,所以学完后来就忘得差不多了...但工作以后才发现,树这种数据结构是那么重要和常见,用得好的话可以让你代码更优雅,性能更佳,为了让树里面的概念更易于理解,关于树的定义这块我尽量通俗,牺牲一些标准性,提高可读性,不至于像读大学课本上对树的定义那样难懂. 1.基本概念 1.1定义 树:是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。 说白话:树是由根节点和树枝节点(暂且这么叫..)和叶子节点共同构成的一种数据结构,树节点之间不存在闭环,每棵树有且仅有一个根节点.直接来张图: 1.2常见术语 根:树的顶点,从它开始可以向下找到任意一个节点,但向上找除了它本身没有任何节点,对应上图中的A节点. 叶子节点:没有孩子的节点就是叶子节点了,对应图中的KLM. 其它非根非叶子节点我一般叫它普通节点,当然不必纠结这些,只要知道根和叶子即可... 森林:多棵树组合在一起就是一个森林,当然如果树的高度>1,把这棵树的根去掉,其它节点所组成的就是一个森林. 森林如下图所示: 高度/深度:树中结点的最大层次 2.树的建立 直接上代码吧,为了代码简洁易懂,暂不考虑NPE: 树节点对象
  • 如何覆盖 SyliusCoreBundle 模型用户(How to override SyliusCoreBundle Model User)
    问题 我尝试在模型用户(SyliusCoreBundle/Model/User)中添加一个新字段“电话”。 避免接触 SyliusCoreBundle, 我创建了一个新捆绑包“ShopBundle”,它位于其他 sylius 捆绑包旁边以覆盖基本用户类: src/Sylius/Bundle/ShopBundle 在文件夹 ShopBundle 中: > /Controller(empty) > /DependencyInjection(empty) > /Model > /User.php > /Resources > /config/doctrine/model/user.orm.xml > /config/service.xml (empty) > SyliusShopBundle.php 在文件src/Sylius/Bundle/ShopBundle/Model/User.php ,我有: <?php namespace Sylius\Bundle\ShopBundle\Model; use Sylius\Bundle\CoreBundle\Model\User as BaseUser; class User extends BaseUser { protected $mobile; /** * {@inheritdoc} */ public function
  • How to define dynamic configuration using the TreeBuilder?
    I want to configure a bundle to allow different behavior for different companies. The config structure within them will be the same. My config.yml shall look like this: bunde_namespace: company: company_1: foo: bar baz: poit company_2: foo: bar baz: poit company_3: ... When I access the $config I expect the array to look something like this: $config['company'] = [ 'company_one' => [ 'foo' => 'bar' 'baz' => 'poit' ], 'company_two' => [ 'foo' => 'bar' 'baz' => 'poit' ], ... ]; Yet I have no experience with the TreeBuilder and setting up the configuration as described in the docs and it still
  • Android JSOUP ExceptionInInitializerError
    I updated my dex classes with amigo library (it's changing one apk for another apk with the same key and signature, all is working except JSOUP) Error: FATAL EXCEPTION: Thread-1567 Process: com.smedic.tubtub, PID: 26102 java.lang.ExceptionInInitializerError at org.jsoup.nodes.Document$OutputSettings.(Document.java:372) at org.jsoup.nodes.Document.(Document.java:19) at org.jsoup.parser.TreeBuilder.initialiseParse(TreeBuilder.java:32) at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:42) at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:56) at org.jsoup.parser.Parser.parseInput
  • Android JSOUP ExceptionInInitializerError(Android JSOUP ExceptionInInitializerError)
    问题 我用 amigo 库更新了我的 dex 类(它正在将一个 apk 更改为另一个具有相同密钥和签名的 apk,除了 JSOUP 之外,所有的都在工作) 错误: 致命异常:Thread-1567 进程:com.smedic.tubtub,PID:26102 java.lang.ExceptionInInitializerError at org.jsoup.nodes.Document$OutputSettings.(Document.java:372) at org.jsoup.nodes.Document.( Document.java:19) at org.jsoup.parser.TreeBuilder.initialiseParse(TreeBuilder.java:32) at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:42) at org.jsoup.parser.HtmlTreeBuilder.parse (HtmlTreeBuilder.java:56) 在 org.jsoup.parser.Parser.parseInput(Parser.java:32) 在 org.jsoup.helper.DataUtil.parseByteData(DataUtil.java:104) 在 org.jsoup
  • 如何在 C# dotnet 中将 HierarchyId 转换为子/父(树)结构?(How to convert HierarchyId to Child/Parent (Tree) structure in C# dotnet?)
    问题 由于某些原因,例如性能,我必须在我的数据库中使用 HiarachyId。 我必须将 HierarchyId 数据类型转换为 JSON 以显示在 FancyTree 中。 我在这里使用解决方案,但不起作用。 我的代码是 static void Main(string[] args) { { var dd = new List<Field>(); dd.Add(new Field(1, "Earth", HierarchyId.Parse("/"))); dd.Add(new Field(2, "Europe", HierarchyId.Parse("/1/"))); dd.Add(new Field(3, "South America", HierarchyId.Parse("/2/"))); dd.Add(new Field(4, "Antarctica", HierarchyId.Parse("/3/"))); dd.Add(new Field(5, "Brazil", HierarchyId.Parse("/2/1/"))); dd.Add(new Field(6, "France", HierarchyId.Parse("/1/1/"))); dd.Add(new Field(7, "Germany", HierarchyId.Parse("/1/4/"))); dd
  • 如何在插件中访问Maven的依赖关系层次结构(How to get access to Maven's dependency hierarchy within a plugin)
    问题 在我的插件中,我需要处理依赖关系层次结构,并获取有关每个依赖关系以及是否被排除的信息(groupId,artifactId,版本等)。 做这个的最好方式是什么? 回答1 依赖插件具有完成大多数工作的树状目标。 它使用DependencyTreeBuilder处理MavenProject ,这将返回一个DependencyNode其中包含有关已解析依赖关系(及其传递依赖关系)的层次结构信息。 您可以直接从TreeMojo复制许多代码。 它使用CollectingDependencyNodeVisitor遍历树并生成所有节点的List 。 您可以通过调用getArtifact()来访问节点的Artifact ,然后根据需要获取工件信息。 为了获得排除原因, DependencyNode有一个getState()方法,该方法返回一个int,指示是否已包含依赖项,或者是否省略了依赖项的原因(DependencyNode类中有常量用于检查返回值) //All components need this annotation, omitted for brevity /** * @component * @required * @readonly */ private ArtifactFactory artifactFactory; private
  • Using the Symfony2 configuration class, how do I define an array node whose children don't have keys?
    Using the configuration class, how do I define an array node without numeric keys? The children of the array do not represent further configuration options. Rather, they will be a list that will not be able to be overwritten selectively, only as a whole. So far I have: public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder; $root = $treeBuilder->root('acme_base'); $root ->children() ->arrayNode('entities') // Unfortunately, this doesn't work ->defaultValue(array( 'Acme\BaseBundle\Entity\DefaultEntity1', 'Acme\BaseBundle\Entity\DefaultEntity2', )) ->end() ->end(); return
  • Symfony2:没有能够加载配置的扩展(Symfony2: There is no extension able to load the configuration for)
    问题 我正在构建一个扩展来从所有已安装的包中加载配置文件。 我的扩展看起来像这样: namespace Acme\MenuBundle\DependencyInjection; // use ... use Acme\MenuBundle\DependencyInjection\Configuration; class AcmeMenuExtension extends Extension { public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); $finder = new \Symfony\Component\Finder\Finder(); $finder ->directories() ->in($container->getParameter('kernel.root_dir') . '/../src/*/*Bundle/Resources') ->path('config'); $possibleLocations = array(); foreach ($finder as $c_dir
  • jsoup code works in Java but not in Android- Nullpointerexception
    I'm trying to write a weather scraping android app using jsoup. I have code working in Java, but even the simplest form I can write in android throws an error. Here's part of my code: private class Retrieve_Weather extends AsyncTask<Void, Void, String> { private final String TAG = "Retrieve_Weather"; protected String doInBackground(Void... params) { String weatherline= "oTHErly"; Log.i(TAG, weatherline); Document doc = null; try { Log.i(TAG, "trying document..."); doc = Jsoup.connect("http://m.wund.com/cgi-bin/findweather/getForecast?brand=mobile&query=02139").get(); Log.i(TAG, "after document
  • 如果我知道其中的标签,如何使用 Perl 的 HTML 模块找到 div 的内容?(How can I find the contents of a div using Perl's HTML modules, if I know a tag inside of it?)
    问题 自从我问如何用正则表达式解析 html 并受到了一些打击(理所当然)之后,我一直在研究 HTML::TreeBuilder、HTML::Parser、HTML::TokeParser 和 HTML::Elements Perl 模块。 我有这样的 HTML: <div id="listSubtitlesFilm"> <dt id="a1"> <a href="/45/subtitles-67624.aspx"> .45 (2006) </a> </dt> </div> 我想解析/45/subtitles-67624.asp ,但更重要的是我想知道如何解析 div 的内容。 我在上一个问题中得到了这个例子: while ( my $anchor = $parser->get_tag('a') ) { if ( my $href = $anchor->get_attr('href') ) { #http://subscene.com/english/Sit-Down-Shut-Up-First-Season/subtitles-272112.aspx push @dnldLinks, $1 if $href =~ m!/subtitle-(\d{2,8})\.aspx!; } 这对此非常有效,但是当我尝试对其进行一些编辑并在“div”上使用它时,它不起作用。 这是我试过的代码:
  • 忠实地保留已解析的XML中的注释(Faithfully Preserve Comments in Parsed XML)
    问题 我想在处理XML时尽可能忠实地保留注释。 我设法保留了注释,但是其内容已被XML转义。 #!/usr/bin/env python # add_host_to_tomcat.py import xml.etree.ElementTree as ET from CommentedTreeBuilder import CommentedTreeBuilder parser = CommentedTreeBuilder() if __name__ == '__main__': filename = "/opt/lucee/tomcat/conf/server.xml" # this is the important part: use the comment-preserving parser tree = ET.parse(filename, parser) # get the node to add a child to engine_node = tree.find("./Service/Engine") # add a node: Engine.Host host_node = ET.SubElement( engine_node, "Host", name="local.mysite.com", appBase="webapps" ) # add a child to
  • jsoup 代码适用于 Java 但不适用于 Android-Nullpointerexception(jsoup code works in Java but not in Android- Nullpointerexception)
    问题 我正在尝试使用 jsoup 编写天气抓取 android 应用程序。 我有在 Java 中工作的代码,但即使是我可以在 android 中编写的最简单的形式也会引发错误。 这是我的代码的一部分: private class Retrieve_Weather extends AsyncTask<Void, Void, String> { private final String TAG = "Retrieve_Weather"; protected String doInBackground(Void... params) { String weatherline= "oTHErly"; Log.i(TAG, weatherline); Document doc = null; try { Log.i(TAG, "trying document..."); doc = Jsoup.connect("http://m.wund.com/cgi-bin/findweather/getForecast?brand=mobile&query=02139").get(); Log.i(TAG, "after document"); weatherline = "newline"; } catch (IOException except) { Log.i(TAG, "Cannot
  • How to load, process and use custom parameters from Yaml configuration files in DI Extension class?
    I'm trying to import a yaml configuration file in my App following the documentation provided here http://symfony.com/doc/current/bundles/extension.html but I always have the error message: There is no extension able to load the configuration for "app" My file is located here : config/packages/app.yaml and has the following structure : app: list: model1: prop1: value1 prop2: value2 model2: ... As this is a simple App, all the files are in src/. So I have src/DependencyInjection/AppExtension.php <?php namespace App\DependencyInjection; use Symfony\Component\DependencyInjection\ContainerBuilder