0

我有以下 HTML:

<h3><strong>Adresse:</strong></h3>
    <p>
Hochschule Darmstadt<br>
TechnologieTransferCentrum<br>
D19, Raum 221, 222<br>
Schöfferstraße 10<br>
<b>64295 Darmstadt</b><p>
<h3>Kommunikationsdaten: </h3> 
<p>

但是<p>and<br>标签没有关闭。

如何提取地址信息:

Hochschule Darmstadt
TechnologieTransferCentrum
D19, Raum 221, 222
Schöfferstraße 10
64295 Darmstadt
4

2 回答 2

0

假设您已在 中解析文档doc,则:

puts doc.at('//h3[contains(strong, "Adresse:")]/following-sibling::p').text

将为您提供以下输出:

Hochschule Darmstadt
TechnologieTransferCentrum
D19, Raum 221, 222
Schöfferstraße 10
64295 Darmstadt
于 2013-05-04T23:06:16.460 回答
0

从这个基础开始:

# encoding: UTF-8
require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<h3><strong>Adresse:</strong></h3>
    <p>
Hochschule Darmstadt<br>
TechnologieTransferCentrum<br>
D19, Raum 221, 222<br>
Schöfferstraße 10<br>
<b>64295 Darmstadt</b><p>
<h3>Kommunikationsdaten: </h3> 
<p>
EOT

puts doc.errors
puts doc.to_html

当我运行代码时,我得到了这个:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<h3><strong>Adresse:</strong></h3>
    <p>
Hochschule Darmstadt<br>
TechnologieTransferCentrum<br>
D19, Raum 221, 222<br>
Schöfferstraße 10<br><b>64295 Darmstadt</b></p>
<p>
</p>
<h3>Kommunikationsdaten: </h3>
<p></p>
</body></html>

请注意,Nokogiri 添加了<html>and<body>标签。此外,它还关闭了<p>标签,添加了</p>. 我们可以告诉它将 HTML 解析为片段,而不是添加标题:

Nokogiri::HTML::DocumentFragment.parse

生成:

<h3><strong>Adresse:</strong></h3>
    <p>
Hochschule Darmstadt<br>
TechnologieTransferCentrum<br>
D19, Raum 221, 222<br>
Schöfferstraße 10<br><b>64295 Darmstadt</b></p><p>
</p><h3>Kommunikationsdaten: </h3>
<p></p>

仍然存在对 HTML 的修正,但它是传入的基本 HTML。无论哪种方式,生成的 HTML 在技术上都是正确的。

寻找有问题的文本:如果只有一个<p>标签,或者它是第一个:

doc.at('p').text
=> "\nHochschule Darmstadt\nTechnologieTransferCentrum\nD19, Raum 221, 222\nSchöfferstraße 1064295 Darmstadt"

或者:

doc.at('h3').next_sibling.next_sibling.text
=> "\nHochschule Darmstadt\nTechnologieTransferCentrum\nD19, Raum 221, 222\nSchöfferstraße 1064295 Darmstadt"

需要两种next_sibling方法。第一个找到紧跟节点末尾的文本<h3>节点:

doc.at('h3').next_sibling
=> #<Nokogiri::XML::Text:0x3fef59dedfb8 "\n    ">
于 2013-05-04T05:32:08.283 回答