使用Python和BeautifulSoup从公共目录中获取信息

时间:2013-09-21 14:47:23

标签: python python-2.7 beautifulsoup urllib2

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

  

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

这句话不是任何特定标签的一部分,所以我认为在整个HTML上使用regexp可能会很好(尝试了一些其他方法但没有工作)所以我写了类似的东西(我已经使用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. 我运行regexp并尝试查找匹配项,但结果变量txt为空列表...
  2. 当我尝试简单地打印整个html时,我发现结果不完整(以(...)<center><b>Other References</b></center> <tr><td></td></tr></br></table></hr></hr></p></hr>结尾)。
  3. 是否可以下载多少数据?我怎样才能克服它?

    [回答clj] 我不自己使用代理 - 但是我不知道我的互联网提供商是否有某些东西......至于代码和信息,这是结果:

    print "info: ", r.info(); 
    print "code: ", r.getcode()
    
    output:
    info:  Server: NetAnswer Server 1.0
    Content-Type: text/html
    
    code:  200
    

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

5 个答案:

答案 0 :(得分: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',  “七月2003年9月19日,  “十月1999年第22号',  “四月20,2004',  “十一月21,2003',  “十一月21,2003',  “十月29,2003']

答案 1 :(得分: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.

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

答案 2 :(得分: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),

答案 3 :(得分: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相同的列表。

答案 4 :(得分: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,因为文本不规则。