获取lxml中元素的内部HTML

时间:2013-02-15 13:56:30

标签: python xpath lxml

我试图在Python中使用lxml和xpath获取子节点的HTML内容。如下面的代码所示,我想找到每个产品节点的html内容。它有像product.html这样的方法吗?

productGrids = tree.xpath("//div[@class='name']/parent::*")
for product in productGrids:
    print #html content of product

6 个答案:

答案 0 :(得分:32)

from lxml import etree
print(etree.tostring(root, pretty_print=True))

您可以在此处看到更多示例:http://lxml.de/tutorial.html

答案 1 :(得分:11)

我相信你想使用tostring()方法:

from lxml import etree

tree = etree.fromstring('<html><head><title>foo</title></head><body><div class="name"><p>foo</p></div><div class="name"><ul><li>bar</li></ul></div></body></html>')
for elem in tree.xpath("//div[@class='name']"):
     # pretty_print ensures that it is nicely formatted.
     print etree.tostring(elem, pretty_print=True)

答案 2 :(得分:0)

您可以使用product.text_content()

答案 3 :(得分:0)

获取 innerHTML或innerXML
的简单函数 。
直接尝试https://pyfiddle.io/fiddle/631aa049-2785-4c58-bf82-eff4e2f8bedb/

功能


def innerXML(elem):
    elemName = elem.xpath('name(/*)')
    resultStr = ''
    for e in elem.xpath('/'+ elemName + '/node()'):
        if(isinstance(e, str) ):
            resultStr = resultStr + ''
        else:
            resultStr = resultStr + etree.tostring(e, encoding='unicode')

    return resultStr

调用

XMLElem = etree.fromstring("<div>I am<name>Jhon <last.name> Corner</last.name></name>.I work as <job>software engineer</job><end meta='bio' />.</div>")
print(innerXML(XMLElem))


逻辑背后

  • 首先获取最外面的元素名称,
  • 然后获取所有子节点
  • 使用tostring将所有子节点转换为字符串
  • 与他们联系

答案 4 :(得分:-1)

另一种方法

x=doc.xpath("//div[@class='name']/parent::*")
print(map(etree.tostring,x))

答案 5 :(得分:-2)

在您想要的特定字段上右键单击(复制,复制xpath)后(在chrome的检查器中),您可能会得到以下内容:

//*[@id="specialID"]/div[12]/div[2]/h4/text()[1]

如果您想要每个&#34; specialID&#34;

的文本元素
//*[@id="specialID"]/div/div[2]/h4/text()[1]

您可以选择其他字段,然后将结果交错

//*[@id="specialID"]/div/div[2]/h4/text()[1] | //*[@id="specialID"]/div/some/weird/path[95]

可以改进示例,但它说明了一点:

//*[@id="mw-content-text"]/div/ul[1]/li[11]/text()

from lxml import html
import requests
page = requests.get('https://en.wikipedia.org/wiki/Web_scraping')
tree = html.fromstring(page.content)
data = tree.xpath('//*[@id="mw-content-text"]/div/ul[1]/li/a/text() | //*[@id="mw-content-text"]/div/ul[1]/li/text()[1]')
print(len(data))
for i in range(len(data)):
    print(data[i])