- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 Nokogiri、Mechanize 和 XPath 解析页面,但是,无论我尝试什么,我都会收到一个空数组。
我在 Chrome 中检查了它并获得了 XPath,然后尝试了多种方法来解析它但总是收到一个空数组。
我试过:
puts page.search('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect
puts post_page.parser.xpath('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect
puts post_page.parser.at_xpath('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect
所有带和不带尾随“/text”
这是我要抓取的页面的来源:
<SCRIPT language="JavaScript">
<!--
document.cookie = "IV_JCT=%2FMPIS; path=/";
//-->
</SCRIPT>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My Schedule</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="-1">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my schedule">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<div align="center">
<strong>My Schedule</strong><br>as of Sun Feb 24 2013 06:43:09 PM CST<br><br>
<div align="left"><pre><br>Employee Name: Johnson Appleseed
Unit = 12345</pre>
<br>
</div>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td colspan="8" align="center"><b><font size="+1">Schedules may be subject to change based on business needs or demand</font></b></td>
</tr>
<tr><td>
<table border="4" bordercolor="#2D73B9" cellpadding="2" cellspacing="2" width="100%">
<tr bgcolor="#7C9BCF">
<td width="12%" align="center"><b>Sunday</b></td>
<td width="12%" align="center"><b>Monday</b></td>
<td width="12%" align="center"><b>Tuesday</b></td>
<td width="12%" align="center"><b>Wednesday</b></td>
<td width="12%" align="center"><b>Thursday</b></td>
<td width="12%" align="center"><b>Friday</b></td>
<td width="12%" align="center"><b>Saturday</b></td>
<td rowspan="2" width="12%" align="center"><b>Total weekly Hours</b></td>
</tr>
<tr bgcolor="#7C9BCF">
<td width="14%" align="center">2013-02-24</td>
<td width="14%" align="center">2013-02-25</td>
<td width="14%" align="center">2013-02-26</td>
<td width="14%" align="center">2013-02-27</td>
<td width="14%" align="center">2013-02-28</td>
<td width="14%" align="center">2013-03-01</td>
<td width="14%" align="center">2013-03-02</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="14%" align="left"><pre> </pre></td>
<td width="14%" align="left"><pre><b>Shift: </b>
5:30 PM - 9:00 PM
<b>Meal:</b>
- </pre></td>
<td width="14%" align="left"><pre> </pre></td>
<td width="14%" align="left"><pre> </pre></td>
<td width="14%" align="left"><pre> </pre></td>
<td width="14%" align="left"><pre><b>Shift: </b>
2:00 PM - 9:15 PM
<b>Meal:</b>
5:45 PM - 6:30 PM</pre></td>
<td width="14%" align="left"><pre><b>Shift: </b>
4:45 PM - 9:15 PM
<b>Meal:</b>
- </pre></td>
<td width="12%" align="center">14.5</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">3.5</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">6.5</td>
<td width="14%" align="center">4.5</td>
<td width="14%" align="center">Daily Hours</td>
</tr>
</table>
</td></tr>
<tr><td>
<table border="4" bordercolor="#2D73B9" cellpadding="2" cellspacing="2" width="100%">
<tr bgcolor="#7C9BCF">
<td width="12%" align="center"><b>Sunday</b></td>
<td width="12%" align="center"><b>Monday</b></td>
<td width="12%" align="center"><b>Tuesday</b></td>
<td width="12%" align="center"><b>Wednesday</b></td>
<td width="12%" align="center"><b>Thursday</b></td>
<td width="12%" align="center"><b>Friday</b></td>
<td width="12%" align="center"><b>Saturday</b></td>
<td rowspan="2" width="12%" align="center"><b>Total weekly Hours</b></td>
</tr>
<tr bgcolor="#7C9BCF">
<td width="14%" align="center">2013-03-03</td>
<td width="14%" align="center">2013-03-04</td>
<td width="14%" align="center">2013-03-05</td>
<td width="14%" align="center">2013-03-06</td>
<td width="14%" align="center">2013-03-07</td>
<td width="14%" align="center">2013-03-08</td>
<td width="14%" align="center">2013-03-09</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="12%" align="center">0.0</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">Daily Hours</td>
</tr>
</table>
</td></tr>
<tr><td>
<table border="4" bordercolor="#2D73B9" cellpadding="2" cellspacing="2" width="100%">
<tr bgcolor="#7C9BCF">
<td width="12%" align="center"><b>Sunday</b></td>
<td width="12%" align="center"><b>Monday</b></td>
<td width="12%" align="center"><b>Tuesday</b></td>
<td width="12%" align="center"><b>Wednesday</b></td>
<td width="12%" align="center"><b>Thursday</b></td>
<td width="12%" align="center"><b>Friday</b></td>
<td width="12%" align="center"><b>Saturday</b></td>
<td rowspan="2" width="12%" align="center"><b>Total weekly Hours</b></td>
</tr>
<tr bgcolor="#7C9BCF">
<td width="14%" align="center">2013-03-10</td>
<td width="14%" align="center">2013-03-11</td>
<td width="14%" align="center">2013-03-12</td>
<td width="14%" align="center">2013-03-13</td>
<td width="14%" align="center">2013-03-14</td>
<td width="14%" align="center">2013-03-15</td>
<td width="14%" align="center">2013-03-16</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="14%" align="left"><pre>Sched Not Posted</pre></td>
<td width="12%" align="center">0.0</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">0.0</td>
<td width="14%" align="center">Daily Hours</td>
</tr>
</table>
</td></tr>
<tr>
<td colspan="8" align="center"><b><font size="+1">Schedules may be subject to change based on business needs or demand</font></b></td>
</tr>
</table >
<p><br>
</p>
<p class="align_center" >
<input type=button value="Print this page" onClick="javascript:window.print();">
<input type=button value="Close This Window" onClick="javascript:window.close();">
</p>
</div>
</body>
</html>
最佳答案
请注意,在您的 XPath 访问器中,您需要 tbody
成为路径的一部分:
puts page.search('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect
puts post_page.parser.xpath('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect
puts post_page.parser.at_xpath('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect
HTML 没有 tbody
标签,导致查找失败。
尝试简化您的访问器。我通常从 Nokogiri 支持的 CSS 开始,然后,如果我不能到达那里,我会切换到 XPath。你的里程可能会有所不同。
例如:
(rdb:1) puts doc.at('table table tr').to_html
输出:
<tr bgcolor="#7C9BCF">
<td width="12%" align="center"><b>Sunday</b></td>
<td width="12%" align="center"><b>Monday</b></td>
<td width="12%" align="center"><b>Tuesday</b></td>
<td width="12%" align="center"><b>Wednesday</b></td>
<td width="12%" align="center"><b>Thursday</b></td>
<td width="12%" align="center"><b>Friday</b></td>
<td width="12%" align="center"><b>Saturday</b></td>
<td rowspan="2" width="12%" align="center"><b>Total weekly Hours</b></td>
</tr>
这是获取列标题的更简单的方法。
要到达第二行,您可以使用:
(rdb:1) puts doc.at('table table tr[2]').to_html
哪个让你:
<tr bgcolor="#7C9BCF">
<td width="14%" align="center">2013-02-24</td>
<td width="14%" align="center">2013-02-25</td>
<td width="14%" align="center">2013-02-26</td>
<td width="14%" align="center">2013-02-27</td>
<td width="14%" align="center">2013-02-28</td>
<td width="14%" align="center">2013-03-01</td>
<td width="14%" align="center">2013-03-02</td>
</tr>
要获取单元格内容,您可以使用:
(rdb:1) puts doc.search('table table tr[2] td').map(&:text)
哪个返回:
2013-02-24
2013-02-25
2013-02-26
2013-02-27
2013-02-28
2013-03-01
2013-03-02
2013-03-03
2013-03-04
2013-03-05
2013-03-06
2013-03-07
2013-03-08
2013-03-09
2013-03-10
2013-03-11
2013-03-12
2013-03-13
2013-03-14
2013-03-15
2013-03-16
注意它是如何返回两个表的标题的。要将其限制在第一个表中,我们可以使用 at
而不是 search
。 at
返回第一个匹配的节点,其中search
返回一个NodeSet,类似于一个数组。此外,search
会查看整个文档以找到所有匹配项,这与 at
的行为不同。
此代码找到第一个表格的第二行,然后遍历嵌入的单元格:
(rdb:1) puts doc.at('table table tr[2]').search('td').map(&:text)2013-02-242013-02-252013-02-262013-02-272013-02-282013-03-012013-03-02
它更简单,更容易理解和维护。
关于ruby - XPath 使用 Nokogiri 返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15059320/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!