替换<a> tags that have two pairs of double quotes</a>

时间:2013-11-13 13:25:50

标签: ruby xml css-selectors nokogiri

之前我曾问过类似的问题,但这个问题略有不同

我对以下这类链接感到满意:

<a href=""ssLINK/prof-steve-jackson"">Professor Steve Jackson</a>

[UPDATE]

这就是我读它的方式:

content = doc.xpath("/wcm:root/wcm:element[@name='Body']").inner_text

链接在href=之后有两对双引号。

我正在尝试删除标记并仅检索文本:

Professor Steve Jackson

要做到这一点,我使用的方法适用于只有一对双引号的链接:

<a href="ssLINK/world">World</a>

这将返回World:

content = Nokogiri::XML.fragment(content_with_link)
content.css('a[href^="ssLINK"]')
.each{|a| a.replace("<>#{a.content}</>")}
=>World

当我尝试为具有两对双引号的链接执行相同操作时,它会抱怨:

content = Nokogiri::XML.fragment(content_with_link)
content.css('a[href^=""ssLINK""]')
.each{|a| a.replace("<>#{a.content}</>")}

错误:

/var/lib/gems/1.9.1/gems/nokogiri-1.6.0/lib/nokogiri/css/parser_extras.rb:87:in
`on_error': unexpected 'ssLINK' after '[:prefix_match, "\"\""]' (Nokogiri::CSS::SyntaxError)

任何人都知道如何克服这个问题?

2 个答案:

答案 0 :(得分:0)

我可以建议你采用两种方法,但这取决于:每个<a>标记是否包含href,其中两个""包围它们,或者它只是带有ssLINK的标记

假设

output = []

input_text = '<a href=""ssLINK/prof-steve-jackson"">Professor Steve Jackson</a>'

1)如果a代码仅与""进行了ssLink的href,那么只需执行

Nokogiri::HTML(input_text).css('a[href=""]').each do |nokogiri_obj|
  output << nokogiri_obj.text
end

# => output = ["Professor Steve Jackson"]

2)如果所有a代码都与h ""进行了对比,那么你可以试试这个

nokogiri_a_tag_obj = Nokogiri::HTML(input_text).css('a[href=""]')
nokogiri_a_tag_obj.each do |nokogiri_obj|
  output << nokogiri_obj.text if nokogiri_obj.has_attribute?('sslink')
end

# => output = ["Professor Steve Jackson"]

如果

采用第二种方法
input_text = '<a href=""ssLINK/prof-steve-jackson"">Professor Steve Jackson</a> Some other Text<a href=""abcd"">Second link</a>'

然后输出也将是["Professor Steve Jackson"]

答案 1 :(得分:0)

您的内容不是XML,因此任何使用XSLT和XPath等XML工具解决问题的尝试都注定要失败。使用正则表达式方法,例如awk或Perl。但是,对我来说,如何匹配

并不是很明显
<a href="" sometext"">

没有匹配

<a href="" sometext="">

因此我们需要了解您尝试解析的语法。