遇到标记时,在Nokogiri中拆分内容

时间:2015-04-19 09:41:35

标签: ruby web-scraping nokogiri

鉴于HTML页面的以下部分,我希望能够将“我们”和“约翰”视为单独的。

            <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在“us”和“John”之间返回某种空格的字符串,或者将“us”和“John”放在不同的字符串中?

理想情况下,所采用的方法将能够处理节点内的任何标签,而我写的代码不必提及特定的标签。

2 个答案:

答案 0 :(得分:3)

您可以致电#children以获取ad_description_node的孩子,然后使用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"
# ]

答案 1 :(得分:3)

text()节点选择器将选择文本节点,这将为您提供自己的节点中的每个文本部分。然后,您可以使用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的直接子项的文本,例如如果strongem标记中有某些文字。如果有可能,您可以使用//text()代替/text()