尝试使用lxml.html从网站的某个部分获取文本

时间:2016-05-06 05:28:57

标签: python html lxml lxml.html

我有一些当前的Python代码应该使用HTML标记所在位置的xpath从网站的某个部分获取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

思想?

2 个答案:

答案 0 :(得分:1)

xpath()方法返回结果列表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 :(得分:1)

正如@alecxe的回答中所提到的,xpath()方法在这种情况下会返回匹配元素的列表,因此当您尝试将列表传递给lxml.html.fromstring()时会出现错误。另外需要注意的是,XPath的text()函数和lxml的{​​{1}}方法都不会返回包含text_content()标记的字符串。它们会自动删除标签(如果有),因此不需要两条<em></em>行。您只需使用replace()或XPath的text_content()函数(而不是string()):

text()