2013-10-08 3 views
1

Я написал простой парсер в Python для этого website. Ниже приведена часть моего кода.
Мои вопросы:xpath для разбора в Python

  1. Как я мог извлечь не только p[1], но и остальные p[2], p[3] ...
  2. Как я могу отделить их друг от друга?

text1 = xmldata.xpath('//p[@class="MsoNormal"][1]//text()') 
a='' 
for i in text1: 
a=a+i.encode('cp1251') 
print a 
+2

Вы можете поделиться своим кодом? какой пакет вы используете? 'Lxml'? –

+0

Вот начало моего кода. import urllib import lxml.html страница1 = urllib.urlopen ('http://www.toponymic-dictionary.in.ua/index.php?option=com_content&view=section&layout=blog&id=1&Itemid=2') страницаWritten = page1 .read() pageReady = pageWritten.decode ('utf-8') xmldata = lxml.html.document_fromstring (pageReady) –

ответ

1

Вы можете использовать lxml.html.parse() функцию, которая принимает файловые как объекты, такие как то, что urllib.urlopen() возвращается. См. lxml documentation on that.

Тогда, как следует @CharlesDuffy, вы можете использовать u'\n'.join() для конкатенации всех текстовых элементов внутри p элементов, которые вы выбираете, с новой строкой \n

Кроме того, я хотел бы предложить работать с юникод строк все вместе, пока не нужно печатать или записывать в файл.

import urllib 
import lxml.html 

page = urllib.urlopen('http://www.toponymic-dictionary.in.ua/index.php?option=com_content&view=section&layout=blog&id=1&Itemid=2') 

# use "page" as a file-like object 
xmldata = lxml.html.parse(page).getroot() 

ptexts = xmldata.xpath('//p[@class="MsoNormal"]//text()') 
joined_text = u'\n'.join(ptexts) 

print joined_text.encode('cp1251') 
0

, не зная, любой фон, я могу предложить только такой:

texts = list(); 
index = 0; 
while(True): 
    index += 1; 
    try: 
     temp = xmldata.xpath('//p[@class="MsoNormal"][%i]//text()' % index); 
    except: 
     break; 
    else: 
     texts.append(); 

после этого блока кода вы будете иметь список тех же элементов, как ваш text1

2

Просто удалите [1], чтобы остановить фильтрацию, и вашим возвращаемым значением будет список, который вы можете перечислить в ''.join() для конкатенации (или '\n'.join(), если вы хотите, чтобы между каждой строкой были строки новой строки).

text_sections = xmldata.xpath('//p[@class="MsoNormal"]//text()') 
print u'\n'.join(text_sections).encode('cp1251') 
+0

На самом деле, я хочу, чтобы между всеми параметрами paragragh были установлены символы новой строки. В результате я хочу, чтобы каждый p [1], p [2], ... был отделен друг от друга. –

+0

@KhrystynaPyurkovska, это то, что сделает код, который я предоставляю выше. –

Смежные вопросы