Ruby 匹配表行id';有一个共同的前缀

Ruby 匹配表行id';有一个共同的前缀,ruby,nokogiri,mechanize,Ruby,Nokogiri,Mechanize,这可能只是一个语法问题 我不清楚如何只匹配id以rowId开头的表行_ agent = Mechanize.new pageC1 = agent.get("/customStrategyScreener!list.action") 该表具有class=tableCellDT pageC1.search('table.tableCellDT tr[@id=rowId_]') # parses OK but returns 0 rows since rowId_ is not match

这可能只是一个语法问题

我不清楚如何只匹配id以rowId开头的表行_

agent = Mechanize.new
  pageC1 = agent.get("/customStrategyScreener!list.action") 
该表具有class=tableCellDT

 pageC1.search('table.tableCellDT tr[@id=rowId_]')  # parses OK but returns 0 rows since rowId_ is not matched exactly.

 pageC1.search('table.tableCellDT tr[@id=rowId_*]')  # Throws an error since * is not treated like a wildcard string match
HTML示例:

 <table id="row" cellpadding="5" class="tableCellDT" cellspacing="1">
<thead>
<tr>
<th class="tableHeaderDT">#</th>
<th class="tableHeaderDT sortable">
<a href="?d-16544-s=1&amp;d-16544-o=2&amp;d-16544-p=1">Screener</a></th>
<th class="tableHeaderDT sortable">
<a href="?d-16544-s=2&amp;d-16544-o=2&amp;d-16544-p=1">Strategy</a></th>
<th class="tableHeaderDT"> </th></tr></thead>
<tbody>
<tr id="rowId_BullPut" class="odd">
<td>   1  </td>
<td>   Bull</td>
<td></td>
<td><a href="link1?model.itemId=2262">Edit</a>&nbsp;&nbsp;
            <a href="javascript:deleteScreener('link2?model.itemId=2262');">Delete</a>&nbsp;&nbsp;
            <a href="link3?model.itemId=2262&amp;amp;model.source=list">View</a>&nbsp;&nbsp;
            </td></tr>

#
1.
公牛

pageC1是一个
Mechanize::Page
对象,而不是
Nokogiri
任何东西。对不起,一开始不清楚。
Mechanize::Page没有#css或#xpath方法,但可以从中提取Nokogiri文档(无论如何在内部使用)。

要获取id以“rowId”开头的
tr
元素:


要获取id以“rowId”开头的
tr
元素,请执行以下操作:

您需要CSS3:

或XPath函数:

pageC1.xpath('.//table[@class="tableCellDT"]//tr[starts-with(@id,"rowId_")]')
尽管Nokogiri方法会根据您编写的内容智能地在CSS或XPath选择器语法之间进行选择,但这并不意味着您可以在同一个查询中混合使用CSS和XPath选择器语法

在行动中:

>> require 'nokogiri'
#=> true

>> doc = Nokogiri.HTML <<ENDHTML; true #hide output from IRB
">> <table class="foo"><tr id="rowId_nonono"><td>Nope</td></tr></table>
">> <table class="tableCellDT">
">>   <tr id="rowId_yesyes"><td>Yes1</td></tr>
">>   <tr id="rowId_andme2"><td>Yes2</td></tr>
">>   <tr id="rowIdNONONO"><td>Needs underscore</td></tr>
">> </table>
">> ENDHTML
#=> true

>> doc.css('table.tableCellDT tr[id^="rowId_"]').map(&:text)
#=> ["Yes1", "Yes2"]

>> doc.xpath('.//table[@class="tableCellDT"]//tr[starts-with(@id,"rowId_")]').map(&:text)
#=> ["Yes1", "Yes2"]
>需要“nokogiri”
#=>正确
>>doc=Nokogiri.HTML>
“>>是的1
“>>是的
“>>需要下划线
">> 
“>>ENDHTML
#=>正确
>>doc.css('table.tableCellDT tr[id^=“rowId_quo;]).map(&:text)
#=>[“是的1”、“是的2”]
>>doc.xpath('.//table[@class=“tableCellDT”]//tr[以(@id,“rowId”)]'开头).map(&:text)
#=>[“是的1”、“是的2”]
您需要CSS3:

或XPath函数:

pageC1.xpath('.//table[@class="tableCellDT"]//tr[starts-with(@id,"rowId_")]')
尽管Nokogiri方法会根据您编写的内容智能地在CSS或XPath选择器语法之间进行选择,但这并不意味着您可以在同一个查询中混合使用CSS和XPath选择器语法

在行动中:

>> require 'nokogiri'
#=> true

>> doc = Nokogiri.HTML <<ENDHTML; true #hide output from IRB
">> <table class="foo"><tr id="rowId_nonono"><td>Nope</td></tr></table>
">> <table class="tableCellDT">
">>   <tr id="rowId_yesyes"><td>Yes1</td></tr>
">>   <tr id="rowId_andme2"><td>Yes2</td></tr>
">>   <tr id="rowIdNONONO"><td>Needs underscore</td></tr>
">> </table>
">> ENDHTML
#=> true

>> doc.css('table.tableCellDT tr[id^="rowId_"]').map(&:text)
#=> ["Yes1", "Yes2"]

>> doc.xpath('.//table[@class="tableCellDT"]//tr[starts-with(@id,"rowId_")]').map(&:text)
#=> ["Yes1", "Yes2"]
>需要“nokogiri”
#=>正确
>>doc=Nokogiri.HTML>
“>>是的1
“>>是的
“>>需要下划线
">> 
“>>ENDHTML
#=>正确
>>doc.css('table.tableCellDT tr[id^=“rowId_quo;]).map(&:text)
#=>[“是的1”、“是的2”]
>>doc.xpath('.//table[@class=“tableCellDT”]//tr[以(@id,“rowId”)]'开头).map(&:text)
#=>[“是的1”、“是的2”]
多亏了

上面的答案是,这是最后一段代码,它解决了我的问题:只获取我需要的行,然后从每一行中只读取某些信息:

 pageC1.search('//tr[starts-with(@id, "rowId_")]').each do |row|

# Read the string after _ in rowId_, part of the "id" in <tr>
    rid = row.attribute("id").text.split("_")[1] # => "BullPut"

# Get the URL of the 3rd <a> link in <td> cell 4    
    link = row.css("td[4] a[3]")[0].attributes["href"].text # => "link3?model.itemId=2262&amp;amp;model.source=list"
 end
pageC1.search('//tr[以(@id,“rowId”)开头])。每个do |行|
#读取rowId中u后的字符串,该字符串是中“id”的一部分
rid=row.attribute(“id”).text.split(“”)[1]#=>“BullPut”
#获取单元格4中第三个链接的URL
link=row.css(“td[4]a[3]”[0]。属性[“href”]。text#=>“link3?model.itemId=2262&;model.source=list”
结束
多亏了

上面的答案是,这是最后一段代码,它解决了我的问题:只获取我需要的行,然后从每一行中只读取某些信息:

 pageC1.search('//tr[starts-with(@id, "rowId_")]').each do |row|

# Read the string after _ in rowId_, part of the "id" in <tr>
    rid = row.attribute("id").text.split("_")[1] # => "BullPut"

# Get the URL of the 3rd <a> link in <td> cell 4    
    link = row.css("td[4] a[3]")[0].attributes["href"].text # => "link3?model.itemId=2262&amp;amp;model.source=list"
 end
pageC1.search('//tr[以(@id,“rowId”)开头])。每个do |行|
#读取rowId中u后的字符串,该字符串是中“id”的一部分
rid=row.attribute(“id”).text.split(“”)[1]#=>“BullPut”
#获取单元格4中第三个链接的URL
link=row.css(“td[4]a[3]”[0]。属性[“href”]。text#=>“link3?model.itemId=2262&;model.source=list”
结束


要提取什么?将有其他行的id不是=“rowId\u xxxx”。那些我需要忽略的。例如,忽略
我理解这一点,但我想知道在输入的情况下您想要什么输出。虽然这不是问题,但最终,对于每个rowId_*tr,我需要在tr的id、单元格2的文本和单元格4的第三链接目标(其中text=“View”)中提取rowId_uuu之后的后缀。Nokogiri行数组很好,就像
pageC1.search('table.tableCellDT tr')
返回,或者返回一个数组数组(每个元素包含由这三个元素组成的字符串)要提取什么?将有其他行的id不是=“rowId_xxxx”。那些我需要忽略的。例如,忽略
我理解这一点,但我想知道给定您的输入,您想要什么输出。虽然这不是问题,但最终,对于每个rowId_*tr,我需要提取tr的id中rowId_uuu之后的后缀,单元格2的文本和单元格4的第三链接目标(其中text=“View”).Nokogiri行数组很好,比如
pageC1.search('table.tableCellDT tr')
返回的内容,或者数组数组(每个元素都包含这三个东西的字符串)
pageC1.search('tr[以(@id,“rowId”)])
获取我
Nokogiri::XML::XPath::SyntaxError:参数数无效://tr[以(,@id)开头,“rowId”)]来自/var/lib/gems/1.9.1/gems/nokogiri-1.5.5/lib/nokogiri/xml/node.rb:159:in
evaluate'`我正在检查
开始于
包含于
处;知道一个与Ruby/Mechanize/nokogiri更相关的更好的参考吗?奇怪的是,它正在修改
开始于()
以包含一个“
“作为第一个参数。请特别尝试使用
xpath()
方法。如果不起作用,请尝试
'tr[id[以(,“rowId”)开头]“
。我认为问题在于,通过使用
搜索
Nokogiri不知道您使用的是CSS还是XPath,它将XPath查询转换为CSS。似乎我现在需要从Mechanize页面对象中提取Nokogiri文档。
pageC1.XPath('tr[以(@id,“rowId”)]开头])
gets me
NoMethodError:undefined method
xpath'for#`
pageC1.search('tr[以(@id,“rowId”)开头])
gets me
Nokogiri::XML::xpath::SyntaxError:参数数无效://tr[以(,@id,“rowId”)开头]从/var/lib/gems/1.9.1/gems/nokogiri-1.5.5/lib/nokogiri/xml/node.rb:159:in
evaluate'`我正在检查
starts with
contains
at;知道一个与Ruby/Mechanize/nokogiri更相关的更好的引用吗?奇怪的是,它正在修改
starts-with()
以包含一个“
/code>”作为第一个参数。请特别尝试使用
xpath()
方法。如果这不起作用,请尝试
'tr[id[以(,“rowId”)开头]
。我相信