【问题标题】:Python, lxml.html: Need a generic funtion to return innerhtml of any elementPython,lxml.html:需要一个通用函数来返回任何元素的 innerhtml
【发布时间】:2021-05-01 23:47:46
【问题描述】:

我发现 Siva Kannan 的一个不错的函数 here,但在我的情况下它不起作用。我正在使用 lxml.html 从页面而不是 etree 获取数据。当我使用 etree 时出现异常:

lxml.etree.XMLSyntaxError: error parsing attribute name

下面是他的示例修改为首先从黄页页面获取数据,然后尝试从特定的 div 标签获取 innerhtml

任何帮助都会很棒,应该可以帮助很多人。

谢谢

from lxml import etree
import requests, time, socket
import lxml.html as lxml

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

# This works nicely but for my data
# XMLElem = etree.fromstring("<div>I am<xxxxxx>Jhon <last.xxxxx> Corner</last.xxxxx></xxxxxx>.I    work as <job>software engineer</job><end meta='bio' />.</div>")
# print(innerXML(XMLElem))

response = requests.get('https://www.yellowpages.com/washington-dc/mip/bnsf-railway-496598824')
data = response.text
# The next line is how I need to get data for all my work.
# tree = lxml.fromstring(data)

# Siva Kannan's way
tree = etree.fromstring(data)
div_node = tree.xpath("//dd[@class='open-hours']")
# div_node = tree.xpath("//dd[@class='open-hours']//div")  # When using lxml.fromstring (my normal    code) this returns a list when using 

div_html = innerXML(div_node)
print(div_html)

【问题讨论】:

  • 只是不要切换到lxml.etree,因为通常无法使用 XML 解析器解析 HTML。保持你的tree 定义为:tree = lxml.fromstring(data)

标签: python xpath lxml.html


【解决方案1】:

删除from lxml import etree,将etree.tostring替换为lxml.tostring,将etree.fromstring替换为lxml.fromstring

附带说明,此代码也会产生错误,因为div_node 将是节点列表而不是节点,但这应该很容易修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2019-05-09
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多