【发布时间】:2016-12-06 10:50:35
【问题描述】:
我正在尝试以编程方式从该网页中提取描述公共档案中基因组组装的文本:
http://www.ebi.ac.uk/ena/data/view/ERS019623
我有数以千计的程序集要追踪并提取研究加入,即表格最左侧以“PRJ”开头的代码。这些程序集中的每一个的 URL 的格式都与上述相同,即“http://www.ebi.ac.uk/ena/data/view/ERS******”。我的每个程序集都有 ERS 代码,因此我可以为每个程序集构建 URL。
我尝试了几种不同的方法,首先,如果您将“&display=XML”添加到 URL 的末尾,它会打印 XML(或者至少我假设它正在打印整个页面的 XML,因为问题是这里找不到学习资料“PRJ******”)。我已经利用它从同一个网页中提取了我需要的另一个代码,运行访问的格式始终为“ERR******”,使用以下代码:
import urllib2
from bs4 import BeautifulSoup
import re
import csv
with open('/Users/bj5/Desktop/web_scrape_test.csv','rb') as f:
reader = csv.reader(f) #opens csv containig list of ERS numbers
for row in reader:
sample = row[0] #reads index 0 (1st row)
ERSpage = "http://www.ebi.ac.uk/ena/data/view/" + sample + "&display=xml" #creates URL using ERS number from 1st row
page = urllib2.urlopen(ERSpage) #opens url and assigns it to variable page
soup = BeautifulSoup(page, "html.parser") #parses the html/xml from page and assigns it to variable called soup
page_text = soup.text #returns text from variable soup, i.e. no tags
ERS = re.search('ERS......', page_text, flags=0).group(0) #returns first ERS followed by six wildcards
ERR = re.search('ERR......', page_text, flags=0).group(0) #retursn first ERR followed by six wildcards
print ERS + ',' + ERR + ',' + "http://www.ebi.ac.uk/ena/data/view/" + sample #prints ERS,ERR,URL
这工作得很好,但由于研究加入不在 XML 中,我不能用它来访问它。
我还尝试通过这样做再次使用 BeautifulSoup 下载 HTML:
from bs4 import BeautifulSoup
from urllib2 import urlopen
BASE_URL = "http://www.ebi.ac.uk/ena/data/view/ERS019623"
def get_category_links(section_url):
html = urlopen(section_url).read()
soup = BeautifulSoup(html, "lxml")
print soup
get_category_links(BASE_URL)
但是我在这个输出中也看不到研究加入...
我还尝试使用不同的 python 模块 lxml 来解析 XML 和 HTML,但也没有任何运气。
当我右键单击并检查页面上的元素时,我可以通过 ctrl+F -> PRJ 找到研究加入。
所以我的问题是:我在检查元素、XML 或 HTML(或其他)中查看的代码是什么?为什么当我尝试使用 BeautifulSoup 解析 HTML 时,它与控制台中打印的代码看起来不同?最后,我怎样才能从这些网页中抓取学习资料 (PRJ******)?
(我只编写了几个月的代码,而且我完全是自学成才,所以对于这个问题的稍微混乱的性质表示歉意,但我希望我已经了解了我想要解决的问题做。任何建议或意见将不胜感激。)
【问题讨论】:
-
大多数情况下,当您在浏览器中获得与以编程方式执行 HTTP 请求不同的内容时,这是因为您要查找的内容是由一些 javascript 代码动态生成的 - 您的浏览器执行但不是你自己的代码。您可以尝试使用 selenium 之类的东西来获取完整内容。
标签: python html xml web-scraping beautifulsoup