BeautifulSoup не читает html - PullRequest
       40

BeautifulSoup не читает html

0 голосов
/ 26 ноября 2018

Мне удалось получить запросы на работу при вызове URL-адреса с определенными заголовками, и html страниц печатается, когда я вызываю r.content.

url = 'http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=9854726.PN.&OS=PN/9854726&RS=PN/9854726'
HEADERS = { 'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:63.0) Gecko/20100101 Firefox/63.0"} 

r = requests.get(url, headers = HEADERS)
r = r.content

Вывод соответствует ожидаемому (это сокращенная версиятак как я не хочу спамить весь html):

<HTML>
<HEAD>
<BASE target="_top">
<TITLE>United States Patent: 9854726</TITLE></HEAD>
<!-BUF1=9854726
BUF7=2018
BUF8=48007
BUF9=/1/
BUF51=9
-->...

Однако, когда я передаю его в BeautifulSoup

soup = BeautifulSoup(r)
print soup.prettify()

, он только распечатывает:

<html>
 <head>
  <base target="_top" />
  <title>
   United States Patent: 9854726
  </title>
 </head>
</html>

Он не распечатывает полный HTML.Мне было интересно, есть ли какие-нибудь быстрые решения для этого?Я пытался кодировать запросы в UTF-8, но это не сработало.Я также пытался использовать r.text вместо r.content, но безрезультатно.

Я знаю, что USPO - это старый веб-сайт, поэтому, если нет простых решений, чем я собираюсь попробоватьразобрать его с помощью регулярного выражения

Редактировать: Я только что понял.Проблема заключалась в том, что вывод BeautifulSoup не был отформатирован должным образом.Я использовал регулярные выражения, чтобы удалить его и присоединить его обратно с оригинальным HTML, и это сработало!Спасибо за помощь

1 Ответ

0 голосов
/ 26 ноября 2018

HTML-файл искажен (преднамеренно или непреднамеренно).Он использует "<!-" для запуска комментария вместо "<!--", и BS не может распознать этот комментарий.В качестве быстрого исправления замените неправильный открыватель тегов на правильный:

soup = BeautifulSoup(r.replace("<!-", "<!--"))
print(soup.prettify())
#<html>
# <head>
#  <base target="_top"/>
#  <title>
#   United States Patent: 9854726
#  </title>
# </head>
# <!--BUF1=9854726
#BUF7=2018
#BUF8=48007
#BUF9=/1/
#BUF51=9-->
#</html>

Вы можете получить ответы на другой вопрос , чтобы узнать, как извлечь комментарии, например:

soup.findAll(text=lambda text: isinstance(text, bs4.Comment))
#['BUF1=9854726\nBUF7=2018\nBUF8=48007\nBUF9=/1/\nBUF51=9']
...