遇到标签时在 Nokogiri 中拆分内容
Split content in Nokogiri when tags are encountered
给定 HTML 页面的以下部分,我希望能够将 "us" 和 "John" 分开处理。
<div id="ad-description" class="c-clear c-word-wrap">
Room for rent in Sydney.
<br/><br/>For more information please contact us<br/>John :- 0491 570 156<br/>Jane :- (02) 5550 1234</div>
<!-- google_ad_section_end(name=description) -->
</div>
当使用 Nokogiri 访问广告描述节点,然后在该节点上调用 content
时,我得到 usJohn
作为结果字符串的一部分:
document = Nokogiri::HTML(text)
ad_description_xpath = './/div[contains(@id, "ad-description")]'
ad_description_nodes = document.xpath(ad_description_xpath)
ad_description_node = ad_description_nodes.first
ad_description_node.content # "...please contact usJohn :- ..."
我怎样才能让 Nokogiri return 一个在 "us" 和 "John" 之间带有某种空格的字符串,或者让 "us" 和 "John" 在单独的字符串?
理想情况下,采用的方法将能够处理节点内的任何标签,而我编写的代码不必提及特定标签。
您可以打电话给#children
to get the children of ad_description_node
, and then filter text node with text?
。这样,您将在 ad_description_node
:
中拥有一个文本节点数组
ad_description_node.children.select( &:text? ).map( &:content )
# [
# [0] "\n\n Room for rent in Sydney.\n ",
# [1] "For more information please contact us",
# [2] "John :- 0491 570 156",
# [3] "Jane :- (02) 5550 1234"
# ]
text()
节点 select 或将 select 文本节点,这将在其自己的节点中为您提供每个文本部分。然后,您可以使用 map
获取字符串数组:
document = Nokogiri::HTML(text)
# Note text() added to end of XPath here:
ad_description_nodes = document.xpath('.//div[contains(@id, "ad-description")]/text()'
strings = ad_description_nodes.map &:content
使用您的样本数据,strings
现在看起来像:
["\n\nRoom for rent in Sydney.\n", "For more information please contact us", "John :- 0491 570 156", "Jane :- (02) 5550 1234"]
如您所见,您可能会得到一些额外的前导或尾随空格,以及一些可能仅由空格组成的节点,因此您可能需要更多处理。此外,这会遗漏任何不是 div 的直接子项的文本,例如如果 strong
或 em
标签中有一些文本。如果有可能,您可以使用 //text()
而不是 /text()
。
给定 HTML 页面的以下部分,我希望能够将 "us" 和 "John" 分开处理。
<div id="ad-description" class="c-clear c-word-wrap">
Room for rent in Sydney.
<br/><br/>For more information please contact us<br/>John :- 0491 570 156<br/>Jane :- (02) 5550 1234</div>
<!-- google_ad_section_end(name=description) -->
</div>
当使用 Nokogiri 访问广告描述节点,然后在该节点上调用 content
时,我得到 usJohn
作为结果字符串的一部分:
document = Nokogiri::HTML(text)
ad_description_xpath = './/div[contains(@id, "ad-description")]'
ad_description_nodes = document.xpath(ad_description_xpath)
ad_description_node = ad_description_nodes.first
ad_description_node.content # "...please contact usJohn :- ..."
我怎样才能让 Nokogiri return 一个在 "us" 和 "John" 之间带有某种空格的字符串,或者让 "us" 和 "John" 在单独的字符串?
理想情况下,采用的方法将能够处理节点内的任何标签,而我编写的代码不必提及特定标签。
您可以打电话给#children
to get the children of ad_description_node
, and then filter text node with text?
。这样,您将在 ad_description_node
:
ad_description_node.children.select( &:text? ).map( &:content )
# [
# [0] "\n\n Room for rent in Sydney.\n ",
# [1] "For more information please contact us",
# [2] "John :- 0491 570 156",
# [3] "Jane :- (02) 5550 1234"
# ]
text()
节点 select 或将 select 文本节点,这将在其自己的节点中为您提供每个文本部分。然后,您可以使用 map
获取字符串数组:
document = Nokogiri::HTML(text)
# Note text() added to end of XPath here:
ad_description_nodes = document.xpath('.//div[contains(@id, "ad-description")]/text()'
strings = ad_description_nodes.map &:content
使用您的样本数据,strings
现在看起来像:
["\n\nRoom for rent in Sydney.\n", "For more information please contact us", "John :- 0491 570 156", "Jane :- (02) 5550 1234"]
如您所见,您可能会得到一些额外的前导或尾随空格,以及一些可能仅由空格组成的节点,因此您可能需要更多处理。此外,这会遗漏任何不是 div 的直接子项的文本,例如如果 strong
或 em
标签中有一些文本。如果有可能,您可以使用 //text()
而不是 /text()
。