3 ms·
You can use the BeautifulSoup API with the `lxml` parser: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser https://www.crummy.com/soft
by ivan_ah 9y ago
You can use the BeautifulSoup API with the `lxml` parser:
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser https://www.crummy.com/software/BeautifulSoup/bs4/doc/#insta...
I've heard that `lxml` can choke on certain badly-formed markup, but it's very fast. Personally has never failed on me.
- gros_roberts 9y agolxml.etree.HTMLParser(recover=True) should work for bad HTML. A few times I had to replace characters before giving the page to lxml, but it was more of an encoding issue.
- toutenrab 9y agoIt may not be related but I also noted that processing HTML with lxml (e.g. update every URL of a HTML document with a different domain for instance) was producing malformed HTML with duplicated tags. So I would recommend to use lxml only as a data extraction tool.
- nerdponx 9y agoLXML also is known to have memory leaks [0][1], so be careful using it in any kind of automated system that will be parsing lots of small documents. I personally encountered this issue, and actually caused to abandon a project until months later when I found the references I linked above. It works nice and fast for one-off tasks, though. Also, a question: how often do you really encounter badly-formed markup in the wild? How hard is it really to get HTML right? It seems pretty simple, just close tags and don't embed too much crazy stuff in CDATA. Yet I often read about how HTML parsers must be "permissive" while XML parsers don't need to be. I've never had a problem parsing bad markup; usually my issues have to do with text encoding (either being mangled directly or being correctly-encoded vestiges of a prior mangling) and the other usual problems associated with text data. [0]: https://benbernardblog.com/tracking-down-a-freaky-python-memory-leak-part-2/ https://benbernardblog.com/tracking-down-a-freaky-python-mem... [1]: https://stackoverflow.com/q/5260261 https://stackoverflow.com/q/5260261