首先,是否可以做这样的事情?
我一直在尝试使用"子元素文本值生成Xpath表达式"出现在网页上。尝试使用Python中的lxml(etree,html,getpath),ElementTree模块来完成此操作。但我不知道如何为网页中存在的值生成Xpath表达式。我完全了解python中的Scrapy框架,但这是不同的。
以下是我不完整的代码..
import urllib2, re
from lxml import etree
def wgetUrl(target):
try:
req = urllib2.Request(target)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3 Gecko/2008092417 Firefox/3.0.3')
response = urllib2.urlopen(req)
outtxt = response.read()
response.close()
except:
return ''
return outtxt
newUrl = 'http://www.iupui.edu/~webtrain/tutorials/tables.html' # homepage
dt = wgetUrl(newUrl)
parser = etree.HTMLParser()
tree = etree.fromstring(dt, parser)
根据lxml documentation他们手动创建元素树,但是如何使用我的读取和解析的html数据(在我的示例变量tree
或data
中)来访问子-元件。 或者更重要的是,如果可能的话,子元素文本值。
让我们在上面的示例网页中说,我想搜索表"耗材和费用" 并通过值动态生成Xpath表达式 - 耗材和费用
有没有选择这样做!最终目标,我想实现的是阅读网页,并为网页中的子元素文本值生成Xpath。
答案 0 :(得分:2)
根据文本值的一部分查找所有元素:
"//*[contains(text(), 'some_value')]"
例如,如果你有这个:
<div id="somediv">
<span>Something is here</span>
<a href="#">Click here</a>
</div>
你可以找到包含单词&#34; here&#34;的所有子元素。像这样:
"//div[@id='somediv']//*[contains(text(), 'here')]"
或者,您可以查找包含单词&#34; Something&#34;的所有sub-div span
元素:
"//div[@id='somediv']//span[contains(text(), 'Something')]"
至于在lxml
中解析它:
from lxml import etree
outtxt = response.read()
root = etree.fromstring(outtxt)
root.xpath("my_xpath_expression")
更新:
要获取元素的完整XPath表达式,请使用ElementTree.getPath()
方法,如下所示:
tree = etree.ElementTree(root)
# this will print XPath of all
# elements in 'root'
for e in root.iter():
print tree.getpath(e)