【发布时间】: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)