2013-12-04 3 views
1

Я пытаюсь получить таблицу снизу html без успеха. Раньше я использовал lxml, но он не удался после того, как произошли некоторые изменения в формате текста, который поступает из веб-ссылки. Я мало разбираюсь в разборе. Спасибо за любые подсказки/указатели.разбор таблицы html using beautifulsoup

>>> text2='<html xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://mycompany.com/mynamespace" xmlns:filter="http://mycompany.com/myfilternamespace">\r\n <head>\r\n <META http-equiv="Content-Type" content="text/html; charset=utf-16">\r\n <title>\r\n </title>\r\n </head>\r\n <body>\r\n <table border="1">\r\n  <tr>\r\n  <td>\r\n\t\t\t\t\tCOBDate\r\n\t\t\t\t\t</td>\r\n  <td>TOTAL</td>\r\n  </tr>\r\n  <tr>\r\n <td>2013-6-12</td>\r\n  <td>-10000000</td>\r\n  </tr>\r\n </table>\r\n </body>\r\n</html>' 
>>> soup=BeautifulSoup(text2) 
>>> soup.findAll('table') 
[] 
>>> BeautifulSoup(text2, 'html.parser').find_all('table') 
[<table border="1"> 
<tr> 
<td> 

        COBDate 

        </td> 
<td>TOTAL</td> 
</tr> 
<tr> 
<td>2013-6-12</td> 
<td>-10000000</td> 
</tr> 
</table>] 

Хотя BeautifulSoup (text2, 'html.parser'). Find_all ('стол') возвращает таблицу, то же самое не происходит в тексте ниже,

>>> text1='<html xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://mycompany.com/mynamespace" xmlns:filter="http://mycompany.com/myfilternamespace">\r\n <head>\r\n <META http-equiv="Content-Type" content="text/html; charset=utf-16">\r\n <title>\r\n </title>\r\n </head>\r\n <body>\r\n <table border="1">\r\n  <tr>\r\n  <td>\r\n\t\t\t\t\tCOBDate\r\n\t\t\t\t\t</td>\r\n  <td>TOTAL</td>\r\n  </tr>\r\n  <tr>\r\n  <td>2013-6-13</td>\r\n  <td>-1000000</td>\r\n  </tr>\r\n </table>\r\n </body>\r\n</html>' 
>>> BeautifulSoup(text1, 'html.parser').find_all('table') 
[] 
>>> BeautifulSoup(text1).find_all('table') 
[] 

Я обновленное BeautifulSoup, LXML и libxml2. Не уверен, в чем проблема.

+0

Какая версия BeautifulSoup это? Ваш вход работает отлично для меня, на BeautifulSoup 4.3.2 (с установленным lxml). –

+0

такой же. 4.3.2. Я просто пробовал кодирование, так как он все равно не работал без него. Я отредактирую его. –

+0

Что делает 'BeautifulSoup (text2, 'html.parser'). Find_all ('table')' дает вам? Если вы получите результат, то ваша установка 'lxml' - это ошибка. –

ответ

0

Хотя это меньше ответа и более обходной проблемы. Из комментариев выше я понимаю, что это может быть проблемой с версиями пакетов. Я отправляю решение, которое работает для меня, потому что в случае, если кто-то столкнется или может столкнуться в будущем с аналогичной проблемой. Первый из них, который работал для меня:

from lxml import html

from bs4 import UnicodeDammit

doc = UnicodeDammit(text1, is_html=False)

parser = html.HTMLParser(encoding=doc.original_encoding)

root = html.document_fromstring(text1, parser=parser)

table = root.find('.//table')

А другой просто с помощью BeautifulSoup:

from bs4 import BeautifulSoup

BeautifulSoup(text1, 'xml') или BeautifulSoup(text1, ['lxml','xml'])

Смежные вопросы