Lxml

lxml

2012-12-21

Contents

Contents

2

I lxml

12

1 lxml

13

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Download . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Mailing list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

Bug tracker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

License . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

Old Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2 Why lxml?

16

Motto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

Aims . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3 Installing lxml

18

Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

Building lxml from sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Using lxml with python-libxml2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

MS Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

MacOS-X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

4 Benchmarks and Speed

21

General notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

How to read the timings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Parsing and Serialising . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

The ElementTree API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Child access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Element creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Merging different sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

deepcopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Tree traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

A longer example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

lxml.objectify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

ObjectPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

Caching Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

Further optimisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

5 ElementTree compatibility of lxml.etree

34

2

CONTENTS

CONTENTS

6 lxml FAQ - Frequently Asked Questions

37

General Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

Is there a tutorial? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

Where can I find more documentation about lxml? . . . . . . . . . . . . . . . . . . . . . . . . . . 37

What standards does lxml implement? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

Who uses lxml? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

What is the difference between lxml.etree and lxml.objectify? . . . . . . . . . . . . . . . . . . . 39

How can I make my application run faster? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

What about that trailing text on serialised Elements? . . . . . . . . . . . . . . . . . . . . . . . . 39

How can I find out if an Element is a comment or PI? . . . . . . . . . . . . . . . . . . . . . . . . 40

How can I map an XML tree into a dict of dicts? . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Why does lxml sometimes return 'str' values for text in Python 2? . . . . . . . . . . . . . . . . . 41

Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Which version of libxml2 and libxslt should I use or require? . . . . . . . . . . . . . . . . . . . . 41

Where are the binary builds? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Why do I get errors about missing UCS4 symbols when installing lxml? . . . . . . . . . . . . . . 41

Contributing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Why is lxml not written in Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

How can I contribute? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

My application crashes! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

My application crashes on MacOS-X! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

I think I have found a bug in lxml. What should I do? . . . . . . . . . . . . . . . . . . . . . . . . 43

How do I know a bug is really in lxml and not in libxml2? . . . . . . . . . . . . . . . . . . . . . 44

Threading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Can I use threads to concurrently access the lxml API? . . . . . . . . . . . . . . . . . . . . . . . 44

Does my program run faster if I use threads? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Would my single-threaded program run faster if I turned off threading? . . . . . . . . . . . . . . . 45

Why can't I reuse XSLT stylesheets in other threads? . . . . . . . . . . . . . . . . . . . . . . . . 45

My program crashes when run with mod_python/Pyro/Zope/Plone/... . . . . . . . . . . . . . . . . 45

Parsing and Serialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

Why doesn't the pretty_print option reformat my XML output? . . . . . . . . . . . . . . . 47

Why can't lxml parse my XML from unicode strings? . . . . . . . . . . . . . . . . . . . . . . . . 47

What is the difference between str(xslt(doc)) and xslt(doc).write() ? . . . . . . . . . . . . . . . . 47

Why can't I just delete parents or clear the root node in iterparse()? . . . . . . . . . . . . . . . . . 48

How do I output null characters in XML text? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Is lxml vulnerable to XML bombs? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Can lxml parse from file objects opened in unicode/text mode? . . . . . . . . . . . . . . . . . . . 48

XPath and Document Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

What are the findall() and xpath() methods on Element(Tree)? . . . . . . . . . . . . . . . 48

Why doesn't findall() support full XPath expressions? . . . . . . . . . . . . . . . . . . . . . 49

How can I find out which namespace prefixes are used in a document? . . . . . . . . . . . . . . . 49

How can I specify a default namespace for XPath expressions? . . . . . . . . . . . . . . . . . . . 49

II Developing with lxml

50

7 The lxml.etree Tutorial

51

The Element class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Elements are lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Elements carry attributes as a dict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Elements contain text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Using XPath to find text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Tree iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Serialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

The ElementTree class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

3

CONTENTS

CONTENTS

Parsing from strings and files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 The fromstring() function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 The XML() function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 The parse() function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Parser objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Incremental parsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Event-driven parsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 The E-factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 ElementPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

8 APIs specific to lxml.etree

71

lxml.etree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

Other Element APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

Trees and Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

Error handling on exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Error logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Serialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

CDATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

XInclude and ElementInclude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

write_c14n on ElementTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

9 Parsing XML and HTML with lxml

79

Parsers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

Parser options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Error log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Parsing HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

Doctype information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

The target parser interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

The feed parser interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

iterparse and iterwalk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

Selective tag events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

Comments and PIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

Modifying the tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

iterwalk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

Python unicode strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

Serialising to Unicode strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

10 Validation with lxml

91

Validation at parse time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

DTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

RelaxNG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

XMLSchema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

Schematron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

(Pre-ISO-Schematron) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

11 XPath and XSLT with lxml

101

XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

The xpath() method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

Namespaces and prefixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

XPath return values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

Generating XPath expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

The XPath class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Regular expressions in XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

The XPathEvaluator classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

4

CONTENTS

CONTENTS

ETXPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Error handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 XSLT result objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Stylesheet parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Errors and messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 The xslt() tree method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Dealing with stylesheet complexity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

12 lxml.objectify

111

The lxml.objectify API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

Element access through object attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

Creating objectify trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

Tree generation with the E-factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

Namespace handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Asserting a Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

ObjectPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

Python data types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Recursive tree dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

Recursive string representation of elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

How data types are matched . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

Type annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

XML Schema datatype annotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

The DataElement factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

Defining additional data classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

Advanced element class lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

What is different from lxml.etree? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

13 lxml.html

132

Parsing HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Parsing HTML fragments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Really broken pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

HTML Element Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

Running HTML doctests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

Creating HTML with the E-factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

Viewing your HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

Working with links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

Form Filling Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Form Submission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Cleaning up HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

autolink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

wordwrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

HTML Diff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

Microformat Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

14 lxml.cssselect

143

The CSSSelector class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

The cssselect method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Supported Selectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

15 BeautifulSoup Parser

145

5

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download