0

これは単なる構文の問題かもしれません。

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>

ノート

pageC1Mechanize::Pageオブジェクトであり、何もありませんNokogiri。申し訳ありませんが、最初は明確ではありませんでした。Mechanize::Page には #css メソッドや #xpath メソッドはありませんが、そこから Nokogiri ドキュメントを抽出できます (とにかく内部的に使用されます)。

4

3 に答える 3

2

「rowId_」で始まるtr要素を取得するには:id

pageC1.search('//tr[starts-with(@id, "rowId_")]')
于 2012-11-26T20:27:04.793 に答える
1

CSS3属性の starts-with セレクターのいずれかが必要です。

pageC1.css('table.tableCellDT tr[id^="rowId_"]')

または XPathstarts-with()関数:

pageC1.xpath('.//table[@class="tableCellDT"]//tr[starts-with(@id,"rowId_")]')

NokogiriNode#searchメソッドは、作成した内容に基づいて 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"]
于 2012-11-26T21:07:53.653 に答える
0

http://nokogiri.org/Nokogiri/XML/Node.html#method-i-cssに感謝

および上記の回答、必要な行だけを取得し、それぞれから特定の情報のみを読み取るという問題を解決する最終的なコードを次に示します。

 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
于 2012-11-27T10:21:28.077 に答える