2016-05-06 6 views
2

У меня есть текущий код Python, который должен получить HTML-код с определенной части веб-сайта, используя xpath, где расположен тег HTML ,Попытка получить текст из определенной части веб-сайта с использованием lxml.html

def wordorigins(word): 
    pageopen = lxml.html.fromstring("http://www.merriam-webster.com/dictionary/" + str(word)) 
    pbody = pageopen.xpath("/html/body/div[1]/div/div[4]/div/div[1]/main/article/div[5]/div[3]/div[1]/div/p[1]") 
    etybody = lxml.html.fromstring(pbody) 
    etytxt = etybody.xpath('text()') 
    etytxt = etytxt.replace("<em>", "") 
    etytxt = etytxt.replace("</em>", "") 
    return etytxt 

Этот код возвращает эту ошибку относительно ожидает строку или буфер:

Traceback (most recent call last): 
    File "mott.py", line 47, in <module> 
    print wordorigins(x) 
    File "mott.py", line 30, in wordorigins 
    etybody = lxml.html.fromstring(pbody) 
    File "/usr/lib/python2.7/site-packages/lxml/html/__init__.py", line 866, in fromstring 
    is_full_html = _looks_like_full_html_unicode(html) 
TypeError: expected string or buffer 

Мысли?

ответ

1

xpath() метод возвращает a результаты поиска, fromstring() ожидает строку.

Но вам не нужно повторно обрабатывать часть документа. Просто используйте то, что вы уже нашли:

def wordorigins(word): 
    pageopen = lxml.html.fromstring("http://www.merriam-webster.com/dictionary/" + str(word)) 
    pbody = pageopen.xpath("/html/body/div[1]/div/div[4]/div/div[1]/main/article/div[5]/div[3]/div[1]/div/p[1]")[0] 
    etytxt = pbody.text_content() 
    etytxt = etytxt.replace("<em>", "") 
    etytxt = etytxt.replace("</em>", "") 
    return etytxt 

Обратите внимание, что я использую метод text_content() вместо в xpath("text()").

1

Как указано в ответе @alecxe, метод xpath() возвращает список согласованных элементов в этом случае, следовательно, ошибка при попытке передать список lxml.html.fromstring(). Другое замечание заключается в том, что ни функция text() XPath, ни метод lxmltext_content() никогда не вернут строку, содержащую тег, такой как <em></em>. Они автоматически разделяют теги, если они есть, поэтому две линии replace() не нужны. Вы можете просто использовать text_content() или XPath в string() функции (вместо text()):

...... 
# either of the following lines should be enough 
etytxt = pbody[0].xpath('string()') 
etytxt = pbody[0].text_content()