Как обработать и передать lxml.etree.ParserError в html.fromstring (lxml) - PullRequest
0 голосов
/ 23 октября 2018

[Извините, если мой вопрос немного наивный.Я новичок в python и запросах.] Я пробовал много способов, но все еще не мог найти способ передать lxml.etree.ParserError в html.fromstring.

Мой код выглядит следующим образом:

    from lxml import html
    import requests
    import time
    import csv
    import pandas as pd

    start = time.time()
    data = {}
    data['webid'] = []
    data['name'] = []
    filename = "xxx"+ str(N) + ".csv"

    for i in range(N):
            url = "http://xxx."+str(i)+".html"
            print(url)
            try:
                    page = requests.get(url,timeout=120)
                    try:
                            tree = html.fromstring(page.content)
                            name = tree.xpath('//h2[starts-with(text(),"Name")]/text()')
                            data['webid'].append(i)
                            data['name'].append(name)

                    except (html.ParseError, ParseError):
                            continue
            except requests.exceptions.RequestException as e:
                    continue

            dataframe = pd.DataFrame(data)
            dataframe.to_csv(filename, index=False, sep='|')

    print("took", time.time() - start, "seconds.")

Ошибка выглядит следующим образом:

    Traceback (most recent call last):
      File "xxx/xxx.py", line 43, in <module>
        tree = html.fromstring(page.content)
      File "\AppData\Local\Programs\Python\Python37-32\lib\site-packages\lxml\html\__init__.py", line 876, in fromstring
        doc = document_fromstring(html, parser=parser, base_url=base_url, **kw)
      File "\AppData\Local\Programs\Python\Python37-32\lib\site-packages\lxml\html\__init__.py", line 765, in document_fromstring "Document is empty")
    lxml.etree.ParserError: Document is empty

Я пробовал несколько исключений, например, кроме (lxml.etree.ParserError, etree.ParserError, tree.ParserError, html.ParserError), но ни один из них не работает, и выдает новую ошибку:

Traceback (most recent call last):
   File "D:/Google/Research2017/t/schoolpc/v241.py", line 66, in <module>
    except (lxml.etree.ParserError, ParseError):
NameError: name 'lxml' is not defined 

Могу ли я спросить, есть ли способы передать ParserError и продолжить циклне поднимая ошибку?Большое спасибо!

Большое спасибо @BoboDarph, решение состоит в следующем:

from lxml.etree import ParseError
from lxml.etree import ParserError
...except (ParserError, ParseError)

"Ошибка NameE вызвана тем, как и что вы импортируете. В вашем операторе импорта,вы импортируете конкретный модуль lxml (html), поэтому вы не можете вызвать lxml.etree.ParserError или ParseError, поскольку они не импортированы. Импортировать конкретное исключение в другой оператор импорта (что-то вроде lxml.etree import ParseError) - BoboDarph "

...