Ruby 匹配表行id';有一个共同的前缀
这可能只是一个语法问题 我不清楚如何只匹配id以rowId开头的表行_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
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&d-16544-o=2&d-16544-p=1">Screener</a></th>
<th class="tableHeaderDT sortable">
<a href="?d-16544-s=2&d-16544-o=2&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>
<a href="javascript:deleteScreener('link2?model.itemId=2262');">Delete</a>
<a href="link3?model.itemId=2262&amp;model.source=list">View</a>
</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;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;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 meNoMethodError:undefined method
xpath'for#`pageC1.search('tr[以(@id,“rowId”)开头])
gets meNokogiri::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”)开头]
。我相信