~facelessuser/beautifulsoup/lxml-fix

« back to all changes in this revision

Viewing changes to doc/source/index.rst

  • Committer: Leonard Richardson
  • Date: 2019-07-21 19:50:49 UTC
  • Revision ID: leonardr@segfault.org-20190721195049-vzupkzxai3bx3r8t
Implemented line number tracking for html5lib.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2494
2494
machines, you should specify a parser in the ``BeautifulSoup``
2495
2495
constructor. That will reduce the chances that your users parse a
2496
2496
document differently from the way you parse it.
2497
 
 
2498
 
Line numbers
2499
 
------------
2500
 
 
2501
 
The html.parser parser will keep track of where in the original
2502
 
document it found each Tag. You can access this information as
2503
 
``Tag.lineno`` (line number) and ``Tag.offset`` (position of the start
2504
 
tag within a line)::
2505
 
 
2506
 
   soup = BeautifulSoup("<p>Paragraph 1</p>\n    <p>Paragraph 2</p>", 'html.parser')
2507
 
   for tag in soup.find_all('p'):
2508
 
       print(tag.lineno, tag.offset, tag.string)
2509
 
   # (1, 0, u'Paragraph 1')
2510
 
   # (2, 3, u'Paragraph 2')
2511
 
       
 
2497
   
2512
2498
Encodings
2513
2499
=========
2514
2500
 
2758
2744
 
2759
2745
``UnicodeDammit.detwingle()`` is new in Beautiful Soup 4.1.0.
2760
2746
 
 
2747
Line numbers
 
2748
============
 
2749
 
 
2750
The ``html.parser` and ``html5lib`` parsers can keep track of where in
 
2751
the original document each Tag was found. You can access this
 
2752
information as ``Tag.sourceline`` (line number) and ``Tag.sourcepos``
 
2753
(position of the start tag within a line)::
 
2754
 
 
2755
   markup = "<p\n>Paragraph 1</p>\n    <p>Paragraph 2</p>"
 
2756
   soup = BeautifulSoup(markup, 'html.parser')
 
2757
   for tag in soup.find_all('p'):
 
2758
       print(tag.sourceline, tag.sourcepos, tag.string)
 
2759
   # (1, 0, u'Paragraph 1')
 
2760
   # (2, 3, u'Paragraph 2')
 
2761
 
 
2762
Note that the two parsers mean slightly different things by
 
2763
``sourceline`` and ``sourcepos``. For html.parser, these numbers
 
2764
represent the position of the initial less-than sign. For html5lib,
 
2765
these numbers represent the position of the final greater-than sign.
 
2766
   
 
2767
   soup = BeautifulSoup(markup, 'html5lib')
 
2768
   for tag in soup.find_all('p'):
 
2769
       print(tag.sourceline, tag.sourcepos, tag.string)
 
2770
   # (2, 1, u'Paragraph 1')
 
2771
   # (3, 7, u'Paragraph 2')
 
2772
 
 
2773
You can shut off this feature by passing ``store_line_numbers=False`
 
2774
into the ``BeautifulSoup`` constructor::
 
2775
 
 
2776
   markup = "<p\n>Paragraph 1</p>\n    <p>Paragraph 2</p>"
 
2777
   soup = BeautifulSoup(markup, 'html.parser', store_line_numbers=False)
 
2778
   soup.p.sourceline
 
2779
   # None
 
2780
  
 
2781
This feature is new in 4.8.1, and the parsers based on lxml don't
 
2782
support it.
2761
2783
 
2762
2784
Comparing objects for equality
2763
2785
==============================