1

我对 urllib2/beautifulSoup 有疑问。我尝试从网上阅读一些关于我们专利的信息。确切地说,我需要获取有关何时提交申请的信息。此信息位于以下句子中:

本申请要求美国临时申请的优先权。爵士。2003 年 10 月 29 日提交的第 60/515,559 号美国专利申请,其全部公开内容通过引用明确并入本文。

这句话不是任何特定标签的一部分,所以我认为在整个 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

还有一件事:如果重要的话,我会在 Win7 64 位上使用 Python 2.7.5...

4

5 回答 5

1

use requests and it works perfectly fine

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))

output:

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

于 2013-09-30T19:26:41.427 回答
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

于 2013-09-27T19:48:36.387 回答
0

示例代码(带有所需的导入)实际上也适用于我(OSX python 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 行下方设置了 unicode,但不管有没有它都可以使用。

如果您删除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.

之后字符串中有很多单引号和双引号,这可能会导致解析问题?

于 2013-09-26T20:38:18.977 回答
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),

?

于 2013-09-26T20:55:39.333 回答
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 字符串。我强烈怀疑这很好,并且专利数据看起来很有趣,因为 BS 在其str方法中做了一些事情以使输出更具可读性。

如果是这种情况,这就是为什么将其转换为字符串并尝试使用正则表达式对其进行扫描失败的原因:它正在扫描截断的字符串,无法找到您要查找的内容,仅此而已。

可能值得将 BS 完全排除在外,而只需使用正则表达式扫描原始原始字符串(在我的示例中为patent_html)。有了所有常见的警告,您无法使用正则表达式真正处理 HTML,因为文本不规则。

于 2013-10-02T16:05:01.590 回答