2013-09-21 3 views
1

У меня проблема с urllib2/beautifulSoup. Я пытаюсь прочитать некоторую информацию о наших патентах из Интернета. Чтобы быть точным, мне нужно получить информацию о том, когда приложение было подано. Эта информация содержится в предложении:Получение информации из общедоступного каталога с использованием Python и BeautifullSoup

Эта заявка претендует на приоритет предварительной заявки США. Многосерийный телефильм № 60/515, 559, поданной 29 октября 2003 г., полное раскрытие которой конкретно включено сюда путем ссылки.

Это предложение не является частью какого-либо конкретного тега, так что я думал, что это может быть хорошо использовать регулярное выражение на весь HTML (пробовал некоторые другие способы, но никто не работал), так что я написал что-то вроде этого (я уже использую BeautifullSoup для получить некоторую другую информацию):

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=7442851.PN.&OS=PN/7442851&RS=PN/7442851" 

request = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
patent_data = bs(urllib2.urlopen(request).read()) 

#1 
r = re.compile("[A-Z][a-z]{2}\. \d+, \d\d\d\d") 
txt = r.findall(str(patent_data)) 
print txt 

#2 
print patent_data 

есть две части, чтобы описать проблему:

  1. Я бег регулярному_выражения и попытаться найти матчи, но в результате переменной TXT является пустым список ...
  2. Когда я пытаюсь просто распечатать весь html, я вижу, что результат не завершен (он заканчивается (...)<center><b>Other References</b></center> <tr><td></td></tr></br></table></hr></hr></p></hr>).

Есть ли какой-либо предел количества данных, которые он может загрузить? Как я могу его преодолеть?

[Ответ на CLJ] Я не использую прокси-сервер сам по себе - но я не знаю, если мой интернет-провайдер имеет что-то или нет ... Что касается кода и информации, вот результат:

print "info: ", r.info(); 
print "code: ", r.getcode() 

output: 
info: Server: NetAnswer Server 1.0 
Content-Type: text/html 

code: 200 

еще одно: я использую Python 2.7.5 на Win7 64bit, если это имеет значение ...

+0

Попробуйте увидеть, что на самом деле загрузится, прежде чем передать ответ BeautifulSoup (на всякий случай, если его парсер захлопывает HTML), напечатав ответ напрямую: 'print urllib2.urlopen (request) .read() 'является результатом еще неполным? – clj

+0

Да, он еще неполный. Странно то, что когда я пытаюсь напечатать urllib2.urlopen (request) .read() Я получаю конец ответа, и когда я печатаю patent_data, я начинаю ответ - в обоих случаях результат неполный и не содержит часть Мне нужно. Я также пытался использовать библиотеку запросов вместо urllib2 и иметь ту же проблему ...:/ – Moby04

+0

Это довольно странно! Когда я запускаю свой код (или использую 'curl'), я получаю полное содержимое страницы. Я предполагаю, что все выглядит нормально в вашем браузере? У вас есть какой-либо прокси-сервер или, возможно, прозрачный прокси-сервер, который мешает вашему запросу? Оператор печати # 1 возвращает мне следующее: '['Apr. 21, 2000 ',' Apr. 21, 2000 ',' июль. 19, 2003 ',' окт. 22, 1999 ',' Apr. 20, 2004 ',' ноябрь. 21, 2003 ',' ноябрь. 21, 2003 ',' окт. 29, 2003 ']' ... возможно, посмотрите на заголовок/код состояния 'response = urllib2.urlopen (request); print response.info(); print response.getcode() ' – clj

ответ

0

пример кода (с необходимыми импорта) на самом деле работает для меня тоже (OSX питон 2.7.2):

['Apr. 21, 2000', 'Apr. 21, 2000', 'Jul. 19, 2003', 'Oct. 22, 1999', 'Apr. 20, 2004', 'Nov. 21, 2003', 'Nov. 21, 2003', 'Oct. 29, 2003'] 

У меня есть юникод, установленный ниже моей линии shebang, но он работает с этим или без него.

Что делать, если вы удалите bs() по поводу заявления urllib2? Ваш результат все еще усечен?

patent_data = urllib2.urlopen(request).read() 

Я получаю те же результаты поиска, используя этот текст, а не объект Beautiful Soup.

В исходных данных, единственное упоминание о Other References я считаю, не соответствует тому, что вы говорите, это конец вашей усеченной строки ...

<br /> <center><b>Other References</b></center> <tr><td><align><br />Liu C. et al. 

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

0

Невозможно воспроизвести это странное поведение, и не предполагайте, что это проблема с кодировкой, поскольку я получаю только ответ на 7-битный ASCII-символ. Предполагая, что это вызвано вашей специальной средой (IDE?) С большим текстом (ок.170 K байт ответа):

Пробовали ли вы разделить его вниз, как

request = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
response = urllib2.urlopen(request) 
for i, line in enumerate(response): 
    print "[%4i] %s" % (i, line), 

?

0

Я могу воспроизвести проблему с помощью bs4, но не вижу проблемы, непосредственно анализируя ответ urlopen(...).read(). Документ может показаться неполным, но на самом деле есть закрывающий тег </HTML>, за которым следуют некоторые другие теги.

Глядя на источник страницы в Firefox, показывает тот же неверный HTML-документ. Я думаю, это просто документ, который не может обрабатывать bs4.

>>> txt = urllib2.urlopen(request).read() 
>>> print txt[txt.index("/HTML"):] 
/HTML> 
<P><A HREF=/></A> 
<A HREF=/netahtml/PTO/srchnum.htm></A> 
<A HREF=/netacgi/nph-Parser?SectSect2=HITOFF&d=PALL&p=netahtml%2FPTO%2Fsrchnum.htm&r==54285IMG ALIGN=MIDDLE SRC=/netaicon/PTO/hitlist.gif border=HIT_LIST]></A> 

Наконец я попытался BS3, это, кажется, правильно анализировать документ, наименее r.findall(str(BeautifulSoup(txt))) возвращает тот же список, как разборе txt непосредственно.

1

запросы на использование и она отлично работает

import requests 
import re 

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=7442851.PN.&OS=PN/7442851&RS=PN/7442851" 
response = requests.get(url) 
data = response.text 
r = re.compile("[A-Z][a-z]{2}\. \d+, \d\d\d\d") 
txt = r.findall(str(data)) 

выход:

[ 'Апреле 21, 2000 ', ' Апр. 21, 2000 ', ' июль. 19, 2003 ', ' окт. 22, 1999 ', ' Апр. 20, 2004 ', ' Ноябрь. 21, 2003 ', ' Ноябрь. 21, 2003 ', ' окт. 29, 2003 ']

0

Как и другие, я не могу заставить BS4 разбирать то, что возвращается. Я не в состоянии установить BS3, поэтому я вроде как в тупике здесь.

Но: urllib2 определенно, похоже, извлекает документ без каких-либо проблем.

По крайней мере, часть вашей проблемы (в зависимости от того, что находится в вопросе) заключается в том, что вы берете загруженные данные и запускаете их прямо в BS.

Вместо

patent_data = bs(urllib2.urlopen(request).read()) 

попробовать что-то вроде

patent_html = urllib2.urlopen(request).read() 
patent_data = bs(patent_html) 

patent_html действительно просто строка в HTML, вы получаете обратно. Я сильно подозреваю, что все в порядке, и patent_data выглядит просто смешно, потому что BS делает что-то в своем методе str, чтобы сделать вывод более удобочитаемым.

Если это так, вот почему преобразование его в строку и попытка сканирования его с помощью регулярного выражения не удается: оно сканирует усеченную строку, не в состоянии найти то, что вы ищете, и все.

Это может стоит взять BS полностью из изображения и просто сканировать исходную исходную строку (patent_html в моем примере) с помощью регулярного выражения. Со всеми обычными оговорками, которые вы не можете обработать HTML с регулярным выражением, потому что текст не является регулярным.

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