2016-01-04 5 views
0

Я довольно новичок в Go, и сейчас я немного борюсь с разбором некоторого html.Как получить содержимое элемента HTML

HTML, выглядит следующим образом:

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
</head> 
<body> 

    <div>something</div> 

    <div id="publication"> 
     <div>I want <span>this</span></div> 
    </div> 

    <div> 
     <div>not this</div> 
    </div> 

</body> 
</html> 

И я хочу, чтобы это как строка:

<div>I want <span>this</span></div> 

Я попытался html.NewTokenizer() (от golang.org/x/ net/html), но, похоже, не может вернуть все содержимое элемента из токена или узла. Я также попытался использовать глубину с этим, но он взял другие биты кода.

Я также был пойти с goquery, который кажется идеальным, код:

doc, err := goquery.NewDocument("{url}") 
if err != nil { 
    log.Fatal(err) 
} 

doc.Find("#publication").Each(func(i int, s *goquery.Selection) { 
    fmt.Printf("Review %d: %s\n", i, s.Html()) 
}) 

Но s.Text() будет печатать только текст и s.Html(), кажется, не существует (?).

Я думаю, что разбор его как XML будет работать, за исключением фактического HTML очень глубоко и должно было бы быть структура для каждого родительского элемента ...

Любая помощь будет удивительно!

+3

Что вы имеете в виду «Html) (» кажется, не существует? https://godoc.org/github.com/PuerkitoBio/goquery#Selection.Html - Он возвращает 2 значения, поэтому ваш код не может скомпилироваться. – JimB

+0

ahhh ha! конечно, это выглядит лучше! - спасибо @JimB :) кажется, сейчас работает. Для записи изменили ее на: 'html, _: = s.Html()' 'fmt.Printf (" Обзор% d:% s \ n ", i, html)' –

ответ

0

Вы не получаете результат (s.Html() на самом деле существует), потому что вы не задали переменную и обработчик ошибок.

Пожалуйста, добавьте в свой код и он отлично работает:

doc.Find("#publication").Each(func(i int, s *goquery.Selection) { 
inside_html,_ := s.Html() //underscore is an error 
fmt.Printf("Review %d: %s\n", i, inside_html) 
}) 
Смежные вопросы