Разбор HTML, чтобы получить целый абзац, избегая прерывания от других тегов - PullRequest
0 голосов
/ 16 октября 2011

Я задал вопрос о том, как использовать lxml для анализа URL и получения <p> элементов обратно.Это решено.Однако, чтобы полностью достичь своей цели, мне нужно учесть влияние других тегов внутри <p>.

. Принятый ответ Acorn для анализа URL-адреса и получения <p> имеет следующий вид:

import lxml.html

htmltree = lxml.html.parse('http://www.google.com/intl/en/about/corporate/index.html')

print htmltree.xpath('//p/text()')

Однако, htmltree.xpath('//p/text()'), если внутри абзаца <p> есть другие теги, кусочки будут возвращены, а текст между другими тегами будет игнорироваться.

Например, для <p>Text1... <a href="/link.../">hyperlinked text..</a> Text2....

В настоящее время, используя htmltree.xpath('//p/text()'), он анализируется в ['Text1...','Text2...'].
Более интуитивно, ожидаемый результат должен быть ['Text1... hyperlinked text.. Text2...'].

Поэтому я хотел бы знать, какие еще методы я должен использовать, чтобы разобрать его в единое целое и каким-то образом исправить прерывания другим типомтеги, например <a>?

Я также изучил документацию lxml xpath , и я подозреваю, что это из-за /text() в //p/text().Но я застрял здесь и понятия не имею, что изменить.

Ответы [ 2 ]

4 голосов
/ 16 октября 2011

Да, /text() получает непосредственный текстовый элемент в этом теге. Вместо этого получите все теги p и используйте .text_content(), чтобы получить весь текст в них. From lxml.html doc:

.text_content ():

Возвращает текстовое содержимое элемента, включая текстовое содержимое дочерних элементов без разметки.

Так что у вас будет что-то вроде этого:

import lxml.html

htmltree = lxml.html.parse('http://www.google.com/intl/en/about/corporate/index.html')

p_tags = htmltree.xpath('//p')
p_content = [p.text_content() for p in p_tags]

print p_content
1 голос
/ 16 октября 2011
from xml.etree import ElementTree
from StringIO import StringIO

c = ElementTree.iterparse(StringIO('<html><p>hello <a href="">world</a></p>...</html>'))
for a,e in c:
    print '------------- DUMPING --------------'
    ElementTree.dump(e)
    print 'text: ', e.text
    print 'tail: ', e.tail
    print 'tag: ', e.tag

Если ваш xml недействителен, попробуйте установить lxml и изменить xml.etree на lxml.etree.

Надеюсь, это поможет.

...