我有以下功能,它将lxml对象映射到字典的基本工作...
from lxml import etree
tree = etree.parse('file.xml')
root = tree.getroot()
def xml_to_dict(el):
d={}
if el.text:
print '***write tag as string'
d[el.tag] = el.text
else:
d[el.tag] = {}
children = el.getchildren()
if children:
d[el.tag] = map(xml_to_dict, children)
return d
v = xml_to_dict(root)
Run Code Online (Sandbox Code Playgroud)
此刻它给了我......
>>>print v
{'root': [{'a': '1'}, {'a': [{'b': '2'}, {'b': '2'}]}, {'aa': '1a'}]}
Run Code Online (Sandbox Code Playgroud)
但我想....
>>>print v
{'root': {'a': ['1', {'b': [2, 2]}], 'aa': '1a'}}
Run Code Online (Sandbox Code Playgroud)
我如何重写函数xml_to_dict(el)以便获得所需的输出?
这是我正在解析的xml,为清楚起见.
<root>
<a>1</a>
<a>
<b>2</b>
<b>2</b>
</a>
<aa>1a</aa>
</root>
Run Code Online (Sandbox Code Playgroud)
谢谢 :)
如何判断etree.strip_tags()从给定标签元素中剥离所有可能的标签?
我是否必须自己绘制地图,例如:
STRIP_TAGS = [ALL TAGS...] # Is there a built in list or dictionary in lxml
# that gives you all tags?
etree.strip_tags(tag, *STRIP_TAGS)
Run Code Online (Sandbox Code Playgroud)
也许是一个我不知道的更优雅的方法?
输入示例:
parent_tag = "<parent>This is some <i>text</i> with multiple <some_tag>tags</some_tag> and sometimes they <tt>are<bold> nested</bold></tt>.</parent>"
Run Code Online (Sandbox Code Playgroud)
期望的输出:
# <parent>This is some text with multiple tags and sometimes they are nested.</parent>
Run Code Online (Sandbox Code Playgroud)
甚至更好:
This is some text with multiple tags and sometimes they are nested.
Run Code Online (Sandbox Code Playgroud) 我正在制作一个网络爬虫.为了在页面中查找链接,我在selenium中使用xpath
driver = webdriver.Firefox()
driver.get(side)
Listlinker = driver.find_elements_by_xpath("//a")
Run Code Online (Sandbox Code Playgroud)
这很好.然而,测试爬虫,我发现并非所有链接都在a标签下.href有时也用在area或div标签中.
现在我被困住了
driver = webdriver.Firefox()
driver.get(side)
Listlinkera = driver.find_elements_by_xpath("//a")
Listlinkerdiv = driver.find_elements_by_xpath("//div")
Listlinkerarea = driver.find_elements_by_xpath("//area")
Run Code Online (Sandbox Code Playgroud)
这真的把爬行放在网络爬虫里.
我尝试过xpath "//@href",但这不起作用.我也尝试了几种方法来获得所有href url的有效方式,使用美丽的汤和lxml,但到目前为止,无济于事.对不起,我没有任何代码可以用美丽的汤和lxml显示我的努力,但由于这些被证明无用,我删除了它们,这不是最聪明的做法,我知道.我现在开始挽救这些不成功的尝试,为了我自己,如果我想再试一次,并想知道第一次出了什么问题
我能得到的任何帮助都将非常感激.
在virtualenv中,我如何忽略no-site-packages单个包的规则?
一些背景:我使用virtualenv进行部署,但是自从我使用以来需要更长的时间lxml.每次重新安装新的virtualenv时,编译此过程最多需要15分钟.我可以为lxml全局网站包制作某种例外并使用它吗?有没有比将它复制到新的virtualenv更安全/更可靠的选择?
我需要解析以下结构的html表:
<table class="table1" width="620" cellspacing="0" cellpadding="0" border="0">
<tbody>
<tr width="620">
<th width="620">Smth1</th>
...
</tr>
<tr bgcolor="ffffff" width="620">
<td width="620">Smth2</td>
...
</tr>
<tr bgcolor="E4E4E4" width="620">
<td width="620">Smth3</td>
...
</tr>
<tr bgcolor="ffffff" width="620">
<td width="620">Smth4</td>
...
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
Python代码:
r = requests.post(url,data)
html = lxml.html.document_fromstring(r.text)
rows = html.xpath(xpath1)[0].findall("tr")
#Getting Xpath with FireBug
data = list()
for row in rows:
data.append([c.text for c in row.getchildren()])
Run Code Online (Sandbox Code Playgroud)
但我在第三行得到了这个:
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)
任务是从中形成python dict.行数可能不同.
UPD. 改变了我获取HTML代码的方式,以避免请求lib的可能问题.现在它是一个简单的网址:
html = lxml.html.parse(test_url)
Run Code Online (Sandbox Code Playgroud)
这证明每一个都是好的html:
lxml.html.open_in_browser(html)
Run Code Online (Sandbox Code Playgroud)
但仍然是同样的问题: …
我正在尝试从csv创建一个xml文件
CSV:
CatOne, CatTwo, CatThree
ProdOne, ProdTwo, ProdThree
ProductOne, ProductTwo, ProductThree
Run Code Online (Sandbox Code Playgroud)
期望的XML:
<root>
<prod>
<CatOne>ProdOne</CatOne>
<CatTwo>ProdTwo</CatTwo>
<CatThree>ProdThree</CatThree>
</prod>
<prod>
<CatOne>ProductOne</CatOne>
<CatTwo>ProductTwo</CatTwo>
<CatThree>ProductThree</CatThree>
</prod>
</root>
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
#! usr/bin/python
# -*- coding: utf-8 -*-
import csv, sys, os
from lxml import etree
def main():
csvFile = 'test.csv'
xmlFile = open('myData.xml', 'w')
csvData = csv.reader(open(csvFile), delimiter='\t')
header = csvData.next()
details = csvData.next()
details2 = csvData.next()
root = etree.Element('root')
prod = etree.SubElement(root,'prod')
for index in range(0, len(header)):
child = etree.SubElement(prod, header[index])
child.text = details[index] …Run Code Online (Sandbox Code Playgroud) 我试图从这个网站上抓取所有职业页面:http://wearemadeinny.com/find-a-job/
我尝试了下面的内容,但遗憾的是,当您点击其中一个公司页面时,只显示href:
from lxml import html
import requests
page = requests.get("http://wearemadeinny.com/find-a-job/")
tree = lxml.html.fromstring(page.text)
jobs = tree.xpath('//*[@id="venue-hiring"]/a/@href')
links = [x for x in jobs]
print links
Run Code Online (Sandbox Code Playgroud)
我注意到每个都<li>包含html数据属性,其中包含作业页面URL.那么,是否有可能从每个数据中删除data-hiringurl属性<li>.如果没有lxml和XPath选择器是他们的其他选择?
这是<li>我想要从中获取的元素之一.我特意想拉数据-hiringurl ="http://www.admeld.com/about/jobs/"这个元素的xpath是//*[@ id ="v7"]
<li id="v7" data-vid="7" data-name="Admeld" data-address="230 Park Avenue South Suite 1201" data-lat="40.7378349" data-long="-73.9886703" data-url="http://www.admeld.com/" data-hiring="1" data-hiringurl="http://www.admeld.com/about/jobs/" data-whynyc="" data-category="1"><a href="#" class="list-digital">
<span class="venue-name">Admeld</span><br>
<span class="venue-address">230 Park Avenue South</span>
<br><span class="venue-hiring">We are hiring!</span>
</a>
</li>
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用openpyxl python软件包。使用相同的消息时,出现以下消息。
/usr/local/lib/python2.7/dist-packages/openpyxl/ init .py:31:用户警告:lxml的安装版本太旧,无法与openpyxl一起使用
warnings.warn(“ lxml的安装版本太旧,无法与openpyxl一起使用”)
Openpyxl需要lxml 3.2.5或更高版本,并且我的计算机中的版本是3.2.0。当我尝试将lxml升级到最新版本(即3.3.5)时,它被以下消息打断。
i686-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security build/temp.linux-i686-2.7/src/lxml/lxml.etree.o -lxslt -lexslt -lxml2 -lz -lm -o build/lib.linux-i686-2.7/lxml/etree.so
/usr/bin/ld: cannot find -lz
collect2: error: ld returned 1 exit status
error: command 'i686-linux-gnu-gcc' failed with exit status 1
----------------------------------------
Rolling back uninstall of lxml
Replacing /usr/lib/python2.7/dist-packages/lxml
Replacing /usr/lib/python2.7/dist-packages/lxml-3.2.0.egg-info
Cleaning up...
Removing temporary dir /tmp/pip_build_root...
Command /usr/bin/python -c "import setuptools;__file__='/tmp/pip_build_root/lxml/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" …Run Code Online (Sandbox Code Playgroud) 我有一个xml文件看起来像这样
<A>
<B>
<C>
....
</C>
</B>
</A>
Run Code Online (Sandbox Code Playgroud)
我想在元素'A'之上添加root.我找到了一种向root添加元素的方法.但是如何更改现有的root并使用python添加它.
将root添加到xml之后,它应该如下所示
<ROOT>
<A>
<B>
<C>
....
</C>
</B>
</A>
</ROOT>
Run Code Online (Sandbox Code Playgroud) 我有一个wxPython/bs4应用程序,我正在使用cx_freeze构建一个exe.
构建成功没有错误,但尝试运行EXE会导致FeatureNotFoundBeautifulSoup4出错.它抱怨我没有安装我的lxml库.
我已经将程序剥离到它的最小状态并仍然得到错误.
有没有其他人使用cx_freeze成功构建bs4应用程序?
请查看下面的详细信息,并告诉我您可能有的任何想法.
谢谢,
我已经将应用程序简化为最基本的状态,但仍然会出错.我在Python 3.4上也得到了同样的错误.
Traceback (most recent call last):
File "C:\WinPython27\python-2.6.7\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
exec(code, m.__dict__)
File "test.py", line 6, in <module>
File "C:\WinPython27\python-2.6.7\lib\site-packages\bs4\__init__.py", line 152, in __init__
% ",".join(feautres))
FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
Run Code Online (Sandbox Code Playgroud)
我发现有些人说我需要在构建脚本中包含lxml及其依赖项:http://sourceforge.net/p/cx-freeze/mailman/message/27973651/(对不起SF链接).我试过这个,但仍然没有骰子.
注释掉该行soup = BeautifulSoup("<tag>value</tag>", 'xml')不会导致错误.
lxml ×10
python ×10
xml ×3
csv ×1
cx-freeze ×1
dictionary ×1
elementtree ×1
html ×1
list ×1
openpyxl ×1
parsing ×1
selenium ×1
strip ×1
tags ×1
virtualenv ×1
web-crawler ×1
wxpython ×1
xmlroot ×1
xpath ×1