使用Python和soup从公共目录获取信息
我对urlib2/beautifulsou有问题。我试图从网上阅读一些关于美国专利的信息。确切地说,我需要获取申请提交时间的信息。该信息包含在以下句子中: 本申请要求美国临时申请的优先权。瑟。第60/51559号,于2003年10月29日提交,其全部披露通过引用具体并入本文 这句话不是任何特定标记的一部分,因此我认为在整个HTML上使用regexp可能是好的(尝试了一些其他方法,但没有成功),所以我写了类似的东西(我已经使用BeautifullSoup获得了一些其他信息): 有两个部分来描述该问题:使用Python和soup从公共目录获取信息,python,python-2.7,beautifulsoup,urllib2,Python,Python 2.7,Beautifulsoup,Urllib2,我对urlib2/beautifulsou有问题。我试图从网上阅读一些关于美国专利的信息。确切地说,我需要获取申请提交时间的信息。该信息包含在以下句子中: 本申请要求美国临时申请的优先权。瑟。第60/51559号,于2003年10月29日提交,其全部披露通过引用具体并入本文 这句话不是任何特定标记的一部分,因此我认为在整个HTML上使用regexp可能是好的(尝试了一些其他方法,但没有成功),所以我写了类似的东西(我已经使用BeautifullSoup获得了一些其他信息): 有两个部分来描述该问
(…)其他引用结尾
)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…示例代码(带有必需的导入)实际上也适用于我(OSX Python 2.7.2):
我在shebang行下面设置了unicode,但不管有没有它都可以工作
如果删除urllib2
语句周围的bs()
,会怎么样?您的输出是否仍然被截断
patent_data = urllib2.urlopen(request).read()
我使用这个文本结果而不是美丽的汤对象得到相同的搜索结果
在原始数据中,我发现唯一提到的其他引用
与您所说的不匹配的是截断字符串的结尾
<br /> <center><b>Other References</b></center> <tr><td><align><br />Liu C. et al.
其他参考文献
Liu C.等人。
在此之后,字符串中有很多单引号和双引号,这可能会导致解析问题?示例代码(带有必需的导入)实际上也适用于我(OSX python 2.7.2):
我在shebang行下面设置了unicode,但不管有没有它都可以工作
如果删除urllib2
语句周围的bs()
,会怎么样?您的输出是否仍然被截断
patent_data = urllib2.urlopen(request).read()
我使用这个文本结果而不是美丽的汤对象得到相同的搜索结果
在原始数据中,我发现唯一提到的其他引用
与您所说的不匹配的是截断字符串的结尾
<br /> <center><b>Other References</b></center> <tr><td><align><br />Liu C. et al.
其他参考文献
Liu C.等人。
之后,字符串中有很多单引号和双引号,这可能会导致解析问题?无法重现这种奇怪的行为,也不能想象这是一个编码问题,因为我得到的响应只有7位ASCII字符。 假设这是由于您的特殊环境(IDE?)具有较大的文本(约170K字节的响应): 你有没有试着像这样把它分开
request = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"})
response = urllib2.urlopen(request)
for i, line in enumerate(response):
print "[%4i] %s" % (i, line),
?无法重现这种奇怪的行为,也无法想象这是一个编码问题,因为我得到的响应只有7位ASCII字符。 假设这是由于您的特殊环境(IDE?)具有较大的文本(约170K字节的响应): 你有没有试着像这样把它分开
request = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"})
response = urllib2.urlopen(request)
for i, line in enumerate(response):
print "[%4i] %s" % (i, line),
?我可以重现bs4的问题,但在直接解析
urlopen(…).read()的响应时没有发现问题。文档可能看起来不完整,但实际上有一个结束标记,后面跟着一些其他标记
查看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>
>>txt=urllib2.urlopen(请求).read()
>>>打印文本[txt.index(“/HTML”):]
/HTML>
最后,我尝试了bs3,它似乎正确地解析了文档,一个最小的r.findall(str(BeautifulSoup(txt))
返回与直接解析txt
相同的列表。我可以用bs4重现问题,但直接解析urlopen(…).read()的响应没有问题。文档可能看起来不完整,但实际上有一个结束标记,后面跟着一些其他标记
查看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>
>>txt=urllib2.urlopen(请求).read()
>>>打印文本[txt.index(“/HTML”):]
/HTML>
最后,我尝试了bs3,它似乎正确地解析了文档,一个最小的r.findall(str(BeautifulSoup(txt))
返回与直接解析txt
相同的列表。使用请求,效果非常好
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))
输出:
['2000年4月21日',
‘2000年4月21日’,
‘2003年7月19日’,
‘1999年10月22日’,
‘2004年4月20日’,
‘2003年11月21日’,
‘2003年11月21日’,
“2003年10月29日”]使用请求,它工作得非常好
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))
输出:
['2000年4月21日',
‘2000年4月21日’,
‘2003年7月19日’,
‘1999年10月22日’,
‘2004年4月20日’,
‘2003年11月21日’,
‘2003年11月21日’,
“2003年10月29日”]像其他人一样,我无法让BS4解析返回的内容。我不能安装BS3,所以我在这里有点死胡同
但是:urllib2似乎可以毫无困难地检索文档
你的问题(基于问题的内容)至少有一部分是你将下载的数据直接运行到BS中
而不是
patent_data = bs(urllib2.urlopen(request).read())
试试像这样的东西
patent_html = urllib2.urlopen(request).read()
patent_data = bs(patent_html)
html实际上只是一个你们要返回的html字符串。我强烈怀疑这没关系,专利数据看起来很有趣,因为BS在其str方法中做了一些事情,以使输出更具可读性
如果是这种情况,那就是为什么将其转换为字符串并尝试用正则表达式扫描失败的原因:它正在扫描被截断的字符串faili