Nokogiri: как обернуть теги html вокруг заданных элементов xpath?

77
5

У меня есть xpath, чтобы захватить каждый текст node, который не окружен никакими тэгами html. Вместо этого они разделяются через <br>. Я хотел бы обернуть их тегами <span>.


Nokogiri::HTML(open("http://vancouver.en.craigslist.ca/van/swp/1426164969.html"))
.xpath("//br/following-sibling::text()|//br/preceding-sibling::text()").to_a

вернет эти текстовые узлы.


полный пересмотренный код ниже:


doc = Nokogiri::HTML(open("http://vancouver.en.craigslist.ca/van/swp/1426164969.html"))
.xpath("//br/following-sibling::text()|//br/preceding-sibling::text()").wrap("<span></span>")
puts doc

Я ожидал увидеть полный исходный код html с темиками, обернутыми тегами <span>, но я получил следующее:


Date: 2009-10-17,  4:36PM PDT
Reply to:
This is a spectacular open plan 1000 sq. ft. loft is in a former Canada Post building. Upon entering the loft from the hallway you are amazed at where you have arrived.... a stunning, bright and fully renovated apartment that retains its industrial feel. The restoration of the interior was planned and designed by a famous Vancouver architect.
The loft is above a police station, so youÂre guaranteed peace and quite at any time of the day or night.
The neighborhood is safe and lively with plenty of restaurants and shopping. ThereÂs a starbucks across the street and plenty of other coffee shops in the area. Antique alley with its hidden treasures is one block away, as well as the beautiful mile long boardwalk. Skytrain station is one minute away (literally couple of buildings away). 15 minutes to Commercial drive, 20 minutes to downtown Vancouver and Olympic venues.
Apartment Features:
- Fully furnished
- 14 ft ceilings
- Hardwood floors
- Gas fireplace
- Elevator
- Large rooftop balcony
- Full Kitchen: Fully equipped with crystal, china and utensils
- Dishwasher
- Appliances including high-end juice maker, blender, etc.
- WiFi (Wireless Internet)
- Bathtub
- Linens & towels provided
- Hair dryer
- LCD Flat-screen TV with DVD player
- Extensive DVD library
- Music Library: Ipod connection
- Wii console with Guitar Hero, games
- Book and magazine library
- Non-smoking
We are looking to exchange for a place somewhere warm (California, Hawaii, Mexico, South America, Central America) or a place in Europe (UK, Italy, France).
Email for other dates and pictures of the loft.

спросил(а) 2009-10-18T08:20:00+04:00 10 лет, 9 месяцев назад
1
Решение
87

Ваша переменная doc не привязана ко всему документу - вы должны использовать


doc = Nokogiri::HTML(open("http://vancouver.en.craigslist.ca/van/swp/1426164969.html"))
doc.xpath("//br/following-sibling::text()|//br/preceding-sibling::text()").wrap("<span></span>")
puts doc

К сожалению, это не решает проблему, поскольку nokogiri помещает сначала все brs, чем все строки с таким текстом:

<br><br><br><br><span>
text</span><span>
text</span><span>
text</span><span>
text</span>

Но вы можете это сделать


doc = Nokogiri::HTML(open("http://vancouver.en.craigslist.ca/van/swp/1426164969.html"))
doc.search("//br/following-sibling::text()|//br/preceding-sibling::text()").each do |node|
node.replace(Nokogiri.make("<span>#{node.to_html}</span>"))
end
puts doc

ответил(а) 2009-10-25T12:00:00+03:00 10 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема