标签: lxml

我如何映射到字典而不是列表?

我有以下功能,它将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)

谢谢 :)

python xml lxml dictionary list

1
推荐指数
1
解决办法
1193
查看次数

如何在xml标记中去除所有子标记,但是在python中使用lxml将文本合并到parens中?

如何判断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)

python tags lxml strip

1
推荐指数
1
解决办法
2042
查看次数

从代码中获取所有href

我正在制作一个网络爬虫.为了在页面中查找链接,我在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显示我的努力,但由于这些被证明无用,我删除了它们,这不是最聪明的做法,我知道.我现在开始挽救这些不成功的尝试,为了我自己,如果我想再试一次,并想知道第一次出了什么问题

我能得到的任何帮助都将非常感激.

python selenium lxml beautifulsoup web-crawler

1
推荐指数
1
解决办法
4674
查看次数

对virtualenv使用单个站点包(作为例外)

在virtualenv中,我如何忽略no-site-packages单个包的规则?

一些背景:我使用virtualenv进行部署,但是自从我使用以来需要更长的时间lxml.每次重新安装新的virtualenv时,编译此过程最多需要15分钟.我可以为lxml全局网站包制作某种例外并使用它吗?有没有比将它复制到新的virtualenv更安全/更可靠的选择?

python lxml virtualenv

1
推荐指数
1
解决办法
244
查看次数

使用Python中的LXML解析HTML表

我需要解析以下结构的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)

但仍然是同样的问题: …

python parsing lxml

1
推荐指数
1
解决办法
8595
查看次数

Python在循环中从Csv创建XML

我正在尝试从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)

python xml csv lxml

1
推荐指数
1
解决办法
6282
查看次数

是否可以使用XPath选择器(lxml)来刮取html数据属性?

我试图从这个网站上抓取所有职业页面: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)

html python xpath lxml custom-data-attribute

1
推荐指数
1
解决办法
2676
查看次数

无法在Ubuntu中安装LXML Verison 3.3.5

我在我的应用程序中使用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)

python lxml openpyxl

1
推荐指数
1
解决办法
7262
查看次数

PYTHON:如何将根节点添加到XML

我有一个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)

python xml lxml elementtree xmlroot

1
推荐指数
1
解决办法
4061
查看次数

让BeautifulSoup4 + lxml与cx_freeze一起工作需要什么?

摘要:

我有一个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 3.4.4
  • BeautifulSoup4 4.3.2
  • Python 2.7.6(32位)和Python …

python lxml wxpython beautifulsoup cx-freeze

1
推荐指数
1
解决办法
905
查看次数