我在CentOS 5.4上安装了Python 2.6.6,
[@SC-055 lxml-2.3beta1]$ python
Python 2.6.6 (r266:84292, Jan 4 2011, 09:49:55)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Run Code Online (Sandbox Code Playgroud)
我想使用lxml模块,但是从源代码构建失败:
src/lxml/lxml.etree.c:157929: error: ‘xsltLibxsltVersion’ undeclared (first use in this function)
src/lxml/lxml.etree.c:157941: error: ‘__pyx_v_4lxml_5etree_XSLT_DOC_DEFAULT_LOADER’ undeclared (first use in this function)
src/lxml/lxml.etree.c:157941: error: ‘xsltDocDefaultLoader’ undeclared (first use in this function)
src/lxml/lxml.etree.c:157950: error: ‘__pyx_f_4lxml_5etree__xslt_doc_loader’ undeclared (first use in this function)
error: command 'gcc' failed with exit status 1
Run Code Online (Sandbox Code Playgroud) 这可能是难以回答的问题之一,但这里有:
我不认为我的自编程员 - 但我想:-)我已经学会了R,因为我厌倦了spss,而且因为一位朋友向我介绍了这种语言 - 所以我不是一个完全陌生的人编程逻辑.
现在我想学习python - 主要是做屏幕抓取和文本分析,还用于用Pylons或Django编写webapps.
那么:我应该如何学习使用python进行屏幕刮擦?我开始经历那些杂乱无章的文档,但我觉得很多"魔术"正在进行 - 毕竟 - 我正在努力学习,而不仅仅是做.
另一方面:没有理由重新发明轮子,如果Scrapy要屏蔽Django对网页的影响,那么毕竟值得直接进入Scrapy.你怎么看?
哦 - 顺便说一句:屏幕抓取的那种:我想要报道网站(即相当复杂和大的)来提及政治家等等 - 这意味着我需要每天,递增和递归地刮 - 我需要记录结果进入各种各样的数据库 - 这引出了一个奖励问题:每个人都在谈论非SQL数据库.我是否应该立即学会使用例如mongoDB(我认为我不需要强烈的一致性),或者我想做什么是愚蠢的?
感谢您的任何想法 - 如果这是一般被认为是一个编程问题,我道歉.
我正在使用Python中的lxml中的XPath在HTML文档中搜索.我怎样才能获得某个元素的路径?这是ruby nokogiri的例子:
page.xpath('//text()').each do |textnode|
path = textnode.path
puts path
end
Run Code Online (Sandbox Code Playgroud)
打印例如' / html/body/div/div [1]/div [1]/p/text()[1] '这是我想在python中获取的字符串.
这是一个基本问题,我实际上在文档中找不到它: - /
在下面的:
img = house_tree.xpath('//img[@id="mainphoto"]')[0]
Run Code Online (Sandbox Code Playgroud)
如何获取<img/>
标签的HTML ?
我试过添加html_content()
但是得到了AttributeError: 'lxml.etree._Element' object has no attribute 'html_content'
.
此外,它是一个内部有一些内容的标签(例如<p>text</p>
)我如何获得内容(例如text
)?
非常感谢!
当谈到在Python生成XML数据,还有我经常看到推荐的两个库:LXML和ElementTree的
据我所知,这两个库彼此非常相似.它们似乎都具有类似的模块名称,使用指南和功能.甚至导入语句也非常相似.
# Importing lxml and ElementTree
import lxml.etree
import xml.etree.ElementTree
Run Code Online (Sandbox Code Playgroud)
Python的库lxml
和ElementTree
库之间有什么区别?
假设我们有以下html:
<html>
<body>
<a href="/1234.html">TEXT A</a>
<a href="/3243.html">TEXT B</a>
<a href="/7445.html">TEXT C</a>
<body>
</html>
Run Code Online (Sandbox Code Playgroud)
如何让它找到包含"TEXT A"的元素"a"?
到目前为止我有:
root = lxml.hmtl.document_fromstring(the_html_above)
e = root.find('.//a')
Run Code Online (Sandbox Code Playgroud)
我试过了:
e = root.find('.//a[@text="TEXT A"]')
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为"a"标签没有属性"text".
有什么方法可以用与我尝试过的方式类似的方式来解决这个问题吗?
我使用的是Ubuntu云服务器,内存有限,512MB RAM和20GB硬盘.它的450MB + RAM已被进程使用.
我需要安装一个新的软件包lxml
,该软件包Cpython
在安装时会被使用,并且它是一个非常繁重的过程,所以它总是gcc: internal compiler error: Killed (program cc1)
会因错误而退出,这是由于没有可用的RAM来运行.
升级机器是一种选择,但它有自己的问题,我的服务/网站很少来自这个服务器本身.
但是我的本地机器lxml
已经正确安装.既然我lxml
只需要,那么从本地机器的目录中挑选所有有用的文件并将其复制到远程机器中也是可能的吗?
它会这样工作吗?如果是,如何获取包的所有文件?
问候
我正在尝试解析OpenOffice ODS电子表格中的内容.ods格式本质上只是一个包含许多文档的zipfile.电子表格的内容存储在'content.xml'中.
import zipfile
from lxml import etree
zf = zipfile.ZipFile('spreadsheet.ods')
root = etree.parse(zf.open('content.xml'))
Run Code Online (Sandbox Code Playgroud)
电子表格的内容位于单元格中:
table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')
Run Code Online (Sandbox Code Playgroud)
我们也可以直接寻找行:
rows = root.findall('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row')
Run Code Online (Sandbox Code Playgroud)
各个元素知道命名空间:
>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'
Run Code Online (Sandbox Code Playgroud)
如何在find/findall中直接使用命名空间?
显而易见的解决方案不起作用.
试图从表中获取行:
>>> root.findall('.//table:table')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lxml.etree.pyx", line 1792, in lxml.etree._ElementTree.findall (src/lxml/lxml.etree.c:41770)
File "lxml.etree.pyx", line 1297, in lxml.etree._Element.findall (src/lxml/lxml.etree.c:37027)
File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 225, in findall
return list(iterfind(elem, path))
File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 200, in iterfind
selector = _build_path_iterator(path)
File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 184, in _build_path_iterator …
Run Code Online (Sandbox Code Playgroud) 我有一个xml文件,我正在使用lxml中的etree来处理,但是当我向它添加标签时,漂亮的打印似乎不起作用.
>>> from lxml import etree
>>> root = etree.parse('file.xml').getroot()
>>> print etree.tostring(root, pretty_print = True)
<root>
<x>
<y>test1</y>
</x>
</root>
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但现在
>>> x = root.find('x')
>>> z = etree.SubElement(x, 'z')
>>> etree.SubElement(z, 'z1').attrib['value'] = 'val1'
>>> print etree.tostring(root, pretty_print = True)
<root>
<x>
<y>test1</y>
<z><z1 value="val1"/></z></x>
</root>
Run Code Online (Sandbox Code Playgroud)
它不再漂亮了.我还试图"向后"创建z1标签,然后创建z标签并将z1附加到它,然后将z标签附加到x标签.但我得到了相同的结果.
如果我不解析文件并只是一次创建所有标签,它将正确打印.所以我认为它与解析文件有关.
如何让漂亮的印刷工作?
我想在docker中部署我的python项目,我在requirments.txt中写道lxml>=3.5.0
,因为项目需要lxml.这是我的dockfile:
FROM gliderlabs/alpine:3.3
RUN set -x \
&& buildDeps='\
python-dev \
py-pip \
build-base \
' \
&& apk --update add python py-lxml $buildDeps \
&& rm -rf /var/cache/apk/* \
&& mkdir -p /app
ENV INSTALL_PATH /app
WORKDIR $INSTALL_PATH
COPY requirements-docker.txt ./
RUN pip install -r requirements.txt
COPY . .
RUN apk del --purge $buildDeps
ENTRYPOINT ["celery", "-A", "tasks", "worker", "-l", "info", "-B"]
Run Code Online (Sandbox Code Playgroud)
当我将它部署到docker时,我得到了这个:
*********************************************************************************
Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
*********************************************************************************
error: …
Run Code Online (Sandbox Code Playgroud) lxml ×10
python ×10
elementtree ×2
xml ×2
centos5 ×1
docker ×1
dockerfile ×1
gcc ×1
html ×1
parsing ×1
pretty-print ×1
python-2.6 ×1
scrapy ×1
ubuntu ×1
xpath ×1