使用 Ruby 机械化 "links_with" 抓取文本但获得额外内容
Using the Ruby Mechanize "links_with" to grab text but getting extra content
当我使用 Mechanize links_with
方法抓取一组 link 时,我只想要显示 link 的文本,但我得到了一系列额外的字符:
links = @some_page.links_with(text: /V\s.*(BENCH|EARCX)|(BENCH|EARCX).*V/)
links.each do |link|
link.text
end
link 在我的浏览器中显示为“23409BENCH092834
”和“20193BENCH092339
”,这正是我想要的,但是当我将它们保存在我的数据库中时,它们另存为
\r\n\t\t\t\t\r\n\t\t\t\t\t 23409BENCH092834\r\n\t\t\t\t\r\n\t\t\t\t
这些多余的字符是从哪里来的,它们代表什么?我试过对它们使用 text
和 to_s
但它并没有摆脱这些随机字符。
我认为它们可能是转义码,但如果是,我该如何删除它们?
您未能向我们提供示例 HTML 显示您正在处理的标记。这让你很难得到帮助。不要那样做;帮助我们帮助你。
Mechanize 在内部使用 Nokogiri,并且可以 return 为您提供 Nokogiri 文档,因此您会想要获取它。从那里你在 Nokogiri 的域中,这将使你对搜索有更多的控制权。
使用 Mechanize 的 links_with
查找文档中的所有匹配链接,并将它们 return 存储为节点数组,即 NodeSet。这些可能在其中包含许多其他节点,它们负责您看到的选项卡和 returns。虽然 links_with
很有用,但您必须始终意识到有什么东西在 return 影响您,以便您可以正确地做出反应。
您遇到的问题是因为您在提取文本时没有访问正确的标签,或者您所说的在链接中看到的值与您报告的不完全相同。
考虑一下:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
|
<p>bar</p>
</body>
</html>
EOT
从比您应该的确切标签更高的标签(父标签)中提取文本 return 该父标签中的所有内容:
doc.search('body').text # => "\nfoo\n|\nbar\n"
请注意,它拾取了标签之间的换行符和 |
。那是因为 text
returns all 文本节点,而不仅仅是子标签内的那些。所以明确你想要什么很重要。
同样,仅搜索 p
标签 returns 在其中找到的所有文本:
doc.search('p').text # => "foobar"
这通常也行不通,因为 text
会将 search
编辑的 NodeSet return 中找到的节点中的所有文本串联起来,这通常不是很有用.
相反,找到您想要的特定节点并获取其文本:
doc.at('p').text # => "foo"
at
return是第一个匹配的节点,等价于search('p').first
.
如果您想要 p
节点中的所有文本,请遍历它们:
doc.search('p').map(&:text) # => ["foo", "bar"]
在更复杂的文档中,我们通常必须在标签层次结构中找到特定的地标并导航到它,然后进一步搜索,但这是一个单独的问题。
综上所述,下面是一个示例,可帮助您直观地了解您遇到的情况以及如何处理:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<a href="http://example.com">
<span class="hubbub">foo</span>
</a>
|
<a href="http://example.com">
<span class="hubbub">bar</span>
</a>
</body>
</html>
EOT
不要这样做:
doc.search('body').text # => "\n \n foo\n \n |\n \n bar\n \n"
doc.search('a').text # => "\n foo\n \n bar\n "
做这些:
doc.search('a span').map(&:text) # => ["foo", "bar"]
或:
spans = doc.search('a').map{ |link|
link.at('span').text
}
spans # => ["foo", "bar"]
第一个速度更快,因为它依赖于 libXML2 代码来查找 'a span'
CSS 选择器中定义的匹配 span
节点。第二种速度较慢但更灵活,允许您使用 Ruby 的语言来迭代和查看标签。
另见“”。
当我使用 Mechanize links_with
方法抓取一组 link 时,我只想要显示 link 的文本,但我得到了一系列额外的字符:
links = @some_page.links_with(text: /V\s.*(BENCH|EARCX)|(BENCH|EARCX).*V/)
links.each do |link|
link.text
end
link 在我的浏览器中显示为“23409BENCH092834
”和“20193BENCH092339
”,这正是我想要的,但是当我将它们保存在我的数据库中时,它们另存为
\r\n\t\t\t\t\r\n\t\t\t\t\t 23409BENCH092834\r\n\t\t\t\t\r\n\t\t\t\t
这些多余的字符是从哪里来的,它们代表什么?我试过对它们使用 text
和 to_s
但它并没有摆脱这些随机字符。
我认为它们可能是转义码,但如果是,我该如何删除它们?
您未能向我们提供示例 HTML 显示您正在处理的标记。这让你很难得到帮助。不要那样做;帮助我们帮助你。
Mechanize 在内部使用 Nokogiri,并且可以 return 为您提供 Nokogiri 文档,因此您会想要获取它。从那里你在 Nokogiri 的域中,这将使你对搜索有更多的控制权。
使用 Mechanize 的 links_with
查找文档中的所有匹配链接,并将它们 return 存储为节点数组,即 NodeSet。这些可能在其中包含许多其他节点,它们负责您看到的选项卡和 returns。虽然 links_with
很有用,但您必须始终意识到有什么东西在 return 影响您,以便您可以正确地做出反应。
您遇到的问题是因为您在提取文本时没有访问正确的标签,或者您所说的在链接中看到的值与您报告的不完全相同。
考虑一下:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
|
<p>bar</p>
</body>
</html>
EOT
从比您应该的确切标签更高的标签(父标签)中提取文本 return 该父标签中的所有内容:
doc.search('body').text # => "\nfoo\n|\nbar\n"
请注意,它拾取了标签之间的换行符和 |
。那是因为 text
returns all 文本节点,而不仅仅是子标签内的那些。所以明确你想要什么很重要。
同样,仅搜索 p
标签 returns 在其中找到的所有文本:
doc.search('p').text # => "foobar"
这通常也行不通,因为 text
会将 search
编辑的 NodeSet return 中找到的节点中的所有文本串联起来,这通常不是很有用.
相反,找到您想要的特定节点并获取其文本:
doc.at('p').text # => "foo"
at
return是第一个匹配的节点,等价于search('p').first
.
如果您想要 p
节点中的所有文本,请遍历它们:
doc.search('p').map(&:text) # => ["foo", "bar"]
在更复杂的文档中,我们通常必须在标签层次结构中找到特定的地标并导航到它,然后进一步搜索,但这是一个单独的问题。
综上所述,下面是一个示例,可帮助您直观地了解您遇到的情况以及如何处理:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<a href="http://example.com">
<span class="hubbub">foo</span>
</a>
|
<a href="http://example.com">
<span class="hubbub">bar</span>
</a>
</body>
</html>
EOT
不要这样做:
doc.search('body').text # => "\n \n foo\n \n |\n \n bar\n \n"
doc.search('a').text # => "\n foo\n \n bar\n "
做这些:
doc.search('a span').map(&:text) # => ["foo", "bar"]
或:
spans = doc.search('a').map{ |link|
link.at('span').text
}
spans # => ["foo", "bar"]
第一个速度更快,因为它依赖于 libXML2 代码来查找 'a span'
CSS 选择器中定义的匹配 span
节点。第二种速度较慢但更灵活,允许您使用 Ruby 的语言来迭代和查看标签。
另见“